Как периодически ставить задани в очередь вместо их выполнения
Можно ли как-то с помощью celery не выполнять задания через каждые x секунд, а отправлять их в очередь, чтобы одно задание ждало пока не закончится другое? Но чтобы добавление происходило каждые x секунд?
В таком варианте ожидания не происходит и задания выполняются одновременно
@periodic_task(run_every=timedelta(seconds=10), name='task_1')
def task_1():
time.sleep(7)
print(f'{datetime.now().strftime("%H:%M:%S")} Задание 1 закончено')
@periodic_task(run_every=timedelta(seconds=10), name='task_2')
def task_2():
time.sleep(7)
print(f'{datetime.now().strftime("%H:%M:%S")} Задание 2 закончено')
Ответы (1 шт):
Автор решения: eri
→ Ссылка
Так как celery использует multiprocessing для выполнения заданий, Вы можете использовать multiprocessing.Semaphore([value]) для того чтоб притормозить выполнение заданий.
import multiprocessing
sema = multiprocessing.Semaphore(1)
@periodic_task(run_every=timedelta(seconds=10), name='task_1')
def task_1():
sema.acquire()
time.sleep(7)
print(f'{datetime.now().strftime("%H:%M:%S")} Задание 1 закончено')
sema.release()
@periodic_task(run_every=timedelta(seconds=10), name='task_2')
def task_2():
sema.acquire()
time.sleep(7)
print(f'{datetime.now().strftime("%H:%M:%S")} Задание 2 закончено')
sema.release()
Но в данном случае очередь продолжит набиваться так как вторая задача будет выполняться 14 секунд.