flacastrexy
@flacastrexy

Как в боте на aiogram запустить параллельный цикл?

Имеется бот в котором нужно параллельно 2 процесса, сам пуллинг бота и еще один цикл.
Сами 2 процесса работают, но проблема в том, что в цикле не отправляются сообщения из-за async функций, не могу разобрать как сделать, вот код:
Сама функция:
def is_enabled():
	while True:
		for user_id in users:
			send_message(user_id)
		time.sleep(15)

Функция отправки сообщения:
async def send_message(user_id=None):
	if user_id:
		await bot.send_message(chat_id=user_id, text='123')

Сам пуллинг и цикл:
if __name__ == '__main__':
	Process(target=is_enabled).start()
	Process(target=executor.start_polling(dp, skip_updates=True)).start()


Ошибка такая:
RuntimeWarning: coroutine 'send_message' was never awaited
send_message(user_id)
RuntimeWarning: Enable tracemalloc to get the object allocation traceback

Гуглил, но не понял как это исправить в своем контексте
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
flacastrexy
@flacastrexy Автор вопроса
сделал такой код, но сам бот не работает, а цикл работает...
UPD: рабочий вариант ниже в комментарии

async def is_enabled():
	print('запускаю цикл')
	while True:
		print('отправляю сообщения')
		for user_id in users:
			await bot.send_message(chat_id=user_id, text='123')
			print('отправил')
		print('жду')
		time.sleep(10)


async def on_startup(x):
	asyncio.create_task(is_enabled())


if __name__ == '__main__':

	executor.start_polling(dp, skip_updates=True, on_startup=on_startup)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@bacon
Потому что это async и не нужен тут Process, нужен create_task или подобное в рамка текущего event loop, а у aiogram вроде для этого даже есть параметр on_startup у start_polling или чего-то подобное.
Ответ написан
Ваш ответ на вопрос

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

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