@MaxBat

Как запустить две функции параллельно в asyncio?

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

КОД
########################################

BOT_TOKEN = ""

bot = Bot(BOT_TOKEN)
dp = Dispatcher(bot)

########################################


@dp.message_handler(commands=['start'])
async def start_message_reaction(message: types.Message):
    await message.answer(text=f"START_ANSWER", parse_mode="HTML")


def my_start_pooling():
    executor.start_polling(dp, skip_updates=True)


def background_func():
    asyncio.set_event_loop(loop)
    i = 0
    while True:
        print(f"Iteration {i}")
        loop.run_until_complete(bot.send_message(chat_id=1026404282, text=f"Iteration {i}"))
        i += 1
        time.sleep(20)


async def before_background_func():
    await loop.run_in_executor(None, background_func)


async def before_pooling():
    await loop.run_in_executor(None, my_start_pooling)


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    t1 = loop.create_task(before_pooling())
    t2 = loop.create_task(before_background_func())
  • Вопрос задан
  • 291 просмотр
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Намудрил-то, намудрил-то...
background_func() сделай асинхронной, run_in_executor() в ней нафиг не нужен, можно будет просто сделать await bot.send_message(...).
time.sleep(), соответственно, меняешь на await asyncio.sleep().
executor.start_polling() вызывай прямо в теле программы, без выкрутасов.

Для запуска функции при старте бота опиши её как
async def bot_startup(dp: Dispatcher):
и передай её в параметре on_startup при вызове start_polling().
А внутри bot_startup уже делай что нужно, например, asyncio.create_task(background_func()).
Обрати внимание, без await - тогда background_func() будет работать параллельно боту.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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