@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'.

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

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

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