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

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

Похожие вопросы