Запуск двух бесконечных задач с python asyncio - PullRequest
0 голосов
/ 16 июня 2020

Моя программа должна отвечать на сообщения Telegram, получаемые учетной записью пользователя, с текстом, заданным пользователем. Этот текст можно изменить, отправив сообщение боту Telegram. Для бота я использовал PyTelegramBotAPI, а для отправки сообщений из учетной записи пользователя я использовал Telethon. Я могу запустить бота, позвонив по номеру bot.polling(), и он отлично работает. Клиент Telethon также отлично работает отдельно, у него есть такие методы, как:

async def run():
    self.add_event_handler(self.message_handler, events.NewMessage)

    while True:
        #(Every Second the while is supposed to be checked)
        if(condition):
            do_something()

async def message_handler(self, event):
     do_another_thing()

, и для запуска клиента я бы просто:

loop = asyncio.get_event_loop()

loop.run_until_complete(client.run())

Но я не могу заставить их работать одновременно .

Я пробовал:

asyncio.get_event_loop().run_until_complete(asyncio.gather(
    bot.bot.polling(none_stop=True, interval=0.1, timeout=15),
    client.run()
))

запускать их обоих одновременно, но это запускает только бота.

Я также пробовал:

executor = ProcessPoolExecutor(2)
loop = asyncio.get_event_loop()
boo = asyncio.create_task(loop.run_in_executor(executor, bot.bot.polling(none_stop=True, interval=0.5, timeout=15)))
baa = asyncio.create_task(loop.run_in_executor(executor, client.run()))

но это тоже не работает.

подскажите, пожалуйста, как запустить бота и клиента одновременно?

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Проблема, как упоминалось в комментариях Lonami , заключалась в том, что PyTelegramBotAPI не является асинхронной библиотекой, поэтому при добавлении его в событие asyncio l oop он никогда не возвращал управление другим задачам, (client.run() метод в моем случае). Я переключился на aiogram , асинхронную библиотеку, и проблема была решена.

PS PyTelegramBotAPI предлагает асинхронный модуль, но мне не удалось заставить его работать. Не помогло и открытие проблемы на его странице GitHub.

0 голосов
/ 16 июня 2020

Вы должны поместить этот код в конец вашего скрипта.

loop = asyncio.get_event_loop()
loop.create_task(function1())
loop.create_task(function2())
loop.run_forever()
...