Как грамотнее написать скрипт для обновления данных по таймеру?
Всем добра! Пишу телеграм бота и понадобился следующий функционал: по команде от пользователя запускается цикл, который к определенному значению в БД, раз, допустим, в час прибавляет новое значение. А после выполнения некого условия цикл останавливается. Вопрос стоит только в том, какой библиотекой в данном случае лучше воспользоваться для непосредственного управления внесением данных? Пока нашел вариант, как реализовать все на библиотеке schedule (или aioschedule для работы с aiogram), но, возможно, есть более подходящие для данного случая способы?
async def long_task():
while True:
await do_stuff()
await asyncio.sleep(3600) # если нужна простая периодичность
# для запуска
task = asyncio.get_running_loop().create_task(long_task())
# для останова
task.cancel() #выкинет спец. исключение в long_task(), так что finally отработает
zenondd, ну для простой периодичности этого хватит. Вот если что-то более сложное, там уже aioschedule потребуется. Еще один косяк этого решения - при перезапуске бота интервал "поедет", так как начнёт отсчитываться с момента запуска.
zenondd, asyncio.get_running_loop() вернёт объект-реактор (loop) только если он уже создан для данного потока. Её имеет смысл использовать, когда ты уверен что реактор уже есть, так как она простая и быстрая.
Если реактора ещё нет, нужно создать его в начале скрипта через asyncio.new_event_loop().
Либо можно использовать asyncio.get_event_loop(), она создаст реактор если его еще нет или вернёт существующий.