@Soft_touch_plastic

Как можно интегрировать потоки и асинхронность в python?

Здравствуйте, столкнулся с такой проблемой при разработке бота. Бот должен парсить подписчиков канала будучи его администратором, суть в том что бот добавляет нового администратора, которым я управляю через telethon, и с помощью этого администратора человека я несложно могу получить всех подписчиков. Бот написан на telebot, пользователь на teleton. Когда я пытаюсь вызвать внутри бота какой-нибудь метод пользователя, вылезает ошибка
RuntimeError: There is no current event loop in thread 'WorkerThread1'.

Тут человек столкнулся с аналогичной видимо проблемой, но внятного пути решения там особо не было, переписывать не вариант, размеры. Как можно соединить потоки бота и асинхронность пользователя? Была идея как то прерывать поток бота, потом возобновлять после выполнения асинхронного метода, но такого я не нашел.
код метода пользователя

from telethon import TelegramClient
import os
from dotenv import load_dotenv

load_dotenv()

api_id = os.getenv('app_api_id')
api_hash = os.getenv('app_api_hash')

client = TelegramClient('client', api_id, api_hash)

async def get_chat_member(name):
    client.start()
    channel = client.get_entity(name)
    c = client.get_participants(channel, limit=5)
    x = 0
    while x < 5:
        print(c[x])
        x += 1


этот стактрейс возникает только после вызова пользовательского метода, до этого бот функционирует штатно
Полный стактрейс

Traceback (most recent call last):
  File "./admin_bot.py", line 171, in <module>
    Bot.start()
  File "./admin_bot.py", line 166, in start
    self.bot.polling()
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\__init__.py", line 455, in polling
    self.__threaded_polling(none_stop, interval, timeout, long_polling_timeout)
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\__init__.py", line 513, in __threaded_polling
    raise e
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\__init__.py", line 479, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\util.py", line 118, in raise_exceptions
    raise self.exception_info
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telebot\util.py", line 69, in run
    task(*args, **kwargs)
  File "./admin_bot.py", line 141, in message
    app.get_chat_member(channel)
  File "C:\Users\user\Desktop\telegram bot\app.py", line 14, in get_chat_member
    client.start()
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telethon\client\auth.py", line 132, in start
    coro if self.loop.is_running()
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\site-packages\telethon\client\telegrambaseclient.py", line 460, in loop
    return asyncio.get_event_loop()
  File "C:\Users\user\AppData\Local\Programs\Python\Python38-32\lib\asyncio\events.py", line 639, in get_event_loop
    raise RuntimeError('There is no current event loop in thread %r.'
RuntimeError: There is no current event loop in thread 'WorkerThread1'.

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

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

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