Нужны асихронные библиотеки aiogram / pyrogram + schedule / APScheduler. Вот пример на aiogram 2.25 + schedule . Возможно, слегка костыль, но работает. Между выводом 'Старт' и 'Финиш' бот продолжает отзываться на команду /start.
import asyncio
import os
import schedule
from aiogram import Bot, Dispatcher
from aiogram.types import Message
from aiogram.utils import executor
bot = Bot(token=os.environ['token'])
dp = Dispatcher(bot)
@dp.message_handler(commands=['start'])
async def dp_start(message: Message):
await message.answer('Test')
async def run_schedule():
while True:
schedule.run_pending()
await asyncio.sleep(1) # Раз в секунду проверяем, не настал ли момент выполнять задание
async def long_task():
print('Старт')
await asyncio.sleep(10) # Функция, которая долго исполняется
print('Финиш')
def do_task():
asyncio.ensure_future(long_task())
if __name__ == '__main__':
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.create_task(run_schedule()) # Добавляем планировщик в петлю
# schedule.every(15).seconds.do(do_task) # Тестовый вариант каждые 15 секунд
schedule.every(5).minutes.do(do_task)
executor.start_polling(dp, loop=loop, skip_updates=True) # Добавляем петлю к боту и запускаем его