Python. Выполнение задач в определенное время, asyncio, aicron, aioschedule
Стоит теоретическая цель, отсылать пользователю в телеграм сообщение в определенное (личное для каждого пользователя) время. Но я тут чтобы не захламлять, не буду подключать aiogram и т.д.
import asyncio
import aioschedule as schedule
import time
import aiocron
async def job(name): #Функция что должна выполниться
print(f'Hello {name}')
await asyncio.sleep(1) # не понимаю зачем это
@aiocron.crontab('*/1 * * * *', start=True)
def get_data():
find_all = [{'name': 'Max', 'time': '14:49'}, {'name': 'Alex', 'time': '14:49'}, {'name': 'Jim', 'time': '14:50'}, {'name': 'Polina', 'time': '14:51'}]
for a in find_all:
time_from_list = a['time']
name_from_list = a['name']
# Задача на выполнение в конкретное время
schedule.every().day.at(time_from_list).do(job, name=name_from_list)
loop = asyncio.get_event_loop()
while True:
loop.run_until_complete(schedule.run_pending())
time.sleep(1)
#Эта строчка относится к крону
asyncio.get_event_loop().run_forever()
Код более-менее рабочий, но есть проблемы и вопросы.
- При запуске крона, задачи дублируются. То есть если запускать его раз в минуту, то за 10 минут, будет 10 задач на выполнение функции job c уникальным параметром.
Я пробовал убить процессы по-разному, прямо внутри функции get_data
loop.stop()
loop.close()
schedule.cancel_job(job)
schedule.clear()
Но ничего не выходит :( Запустить процесс внутри функции также не получается.
- Это вообще нормальный вариант?
Обращение к БД будет конечно не раз в минуту, как щас выставлено, а гораздо реже. Но если заданий будет создано под 1000 или больше, это нормально?
- time.sleep(1) в while true
Это такая проверка на выполнение задания?
Буду благодарен за помощь и советы.
Ответы (1 шт):
Автор решения: Сергей Шашко
→ Ссылка
find_all = [{'name': 'Max', 'time': '14:49'}, {'name': 'Alex', 'time': '14:49'},
{'name': 'Jim', 'time': '14:50'}, {'name': 'Polina', 'time': '14:51'}]
for a in find_all:
if schedule.get_jobs(a['name']) == []:
schedule.every().day.at(a['time']).do(job, name=a['name']).tag(a['name'])