@wows15
В автоматизации сила, брат

Стоит ли передавать в другой поток loop?

Вопрос чисто характера "как правильнее". Суть: Есть класс, в котором мне нужно использовать TelegramClient telethon'а. Но я не могу в одном потокке инициализировать его, а в другом потоке стартануть, так как даже если якобы использовать telethon.sync, всё равно он у себя получает loop и делает всё асинхронно. Получается надо либо инициализировать его в __init__ и передавать loop из первого потока во второй как аргументом функции, либо инициализировать и стартовать в одном, втором потоке, но пайчарм ругается на это, якобы всё надо инициализировать в __init__. 2 кода предоставил ниже.

Передача loop'а в другой поток
import asyncio
from threading import Thread

from telethon import TelegramClient


class Binance:
    def __init__(self):
        self.loop = asyncio.get_event_loop()
        self.tg_client = TelegramClient('sess', api_id, api_hash)

    def updating(self, loop):
        asyncio.set_event_loop(loop)

        self.tg_client.start(phone, password)
        print('logged in')


binance = Binance()

updater = Thread(target=binance.updating, args=[binance.loop])
updater.start()

input()


Инициализация telethon-клиента в другом потоке
import asyncio
from threading import Thread

from telethon import TelegramClient


class Binance:
    def __init__(self):
        ...

    def updating(self):
        asyncio.set_event_loop(asyncio.new_event_loop())

        self.tg_client = TelegramClient('sess', api_id, api_hash)  # вот здесь ругается пайчарм
        self.tg_client.start(phone, password)
        print('logged in')


binance = Binance()

updater = Thread(target=binance.updating)
updater.start()

input()
  • Вопрос задан
  • 73 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Лучше всего вообще избегать совместного использования потоков и асинхронщины. Есть есть веские основания их совмещать, то лучше стремиться к тому, чтобы у каждого потока был свой цикл событий, так как он не является потокобезопасным.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы