Как вызвать асинхронную функцию для телеграмм бота через сам код, а не через чат в телеграмме?
Имеется функция, которая повторяется каждые 3 секунды. В данной функции вызывается асинхронная функция, которая отправляет юзеру телеграмм сообщение. В итоге должно выйти так, чтобы каждые 3 секунды юзер получал сообщение, но в данном коде после отправки сообщения (сообщение само отправилось мне в личку, я его вижу), функция interview не завершается, тем самым не возвращается в функцию update и программа просто простаивает, не выдавая ошибок.
async def interview():
await bot.send_message(1471718311, 'Тест')
def update():
event_loop = asyncio.get_event_loop()
event_loop.run_until_complete(interview())
event_loop.run_forever()
threading.Timer(2, update).start()
update()
Ответы (1 шт):
async def interview():
await bot.send_message(1471718311, 'Тест')
def update():
loop = asyncio.get_running_loop()
loop.create_task(interview())
loop.call_later(2, update)
loop = asyncio.get_event_loop()
loop.call_soon(update)
loop.run_forever()
При запущенном loop асинхронные функции запускаются через create_task.
Таймер можно заменить на строенный таймер эвент лупа через call_later.
Чтоб первый апдейт был запущен на запущенном эвент лупе его проще всего запланировать через call_soon.
П.С. Вместо run_forever обычно должна быть функция запуска бота, которая запускает run_forever внутри себя, например, start_polling, если она присутствует в коде. Если нет - то run_forever.
П.П.С. Передать параметры в функцию можно через functools.partial