Как выполнять функцию каждые 5 секунд в боте

У меня есть некая функция, которая проверяет, есть ли машины которым нужно заменить топливо. Если такие авто есть, отправляет сообщение пользователю в telegram. Я хочу, чтобы функция срабатывала каждые 5 секунд, при этом не мешая aiogram start polling.

Вот код, который нашел в интернете, но он не работает:

from aiogram import Bot, Dispatcher, executor, types
from asyncio import create_task, sleep, get_event_loop
from handlers.admin import check_oil_change
from config import TOKEN

# =========== base variables =============
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)

# ========== handlers ============
...

# ============ polling ==============
async def main():
    create_task(executor.start_polling(dp))
    while True:
        await sleep(5)
        await check_oil_change(bot)

loop = get_event_loop()
if __name__ == '__main__':
    loop.run_until_complete(main())
    loop.close()

aiogram 2.25.2


Ответы (2 шт):

Автор решения: DG 2626

Могу предложить простое, но наверное не лучшее решение - сделать проверку топлива отдельным .py файлом. Создать инстанс бота и отправлять сообщения можно из разных источников. Нельзя проверять наличие новых сообщений одновременно из нескольких инстансов

→ Ссылка
Автор решения: Сергей Ш
from aiogram import Bot, Dispatcher, executor, types
from asyncio import create_task, sleep
from handlers.admin import check_oil_change
from config import TOKEN

# =========== base variables =============
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)

# ========== handlers ============
...

# ============ polling ==============
async def main():
    while True:
        await sleep(5)
        await check_oil_change(bot)

async def on_startup(_):
    create_task( main())

if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True, on_startup=on_startup)

или тут ищите

→ Ссылка