Как периодически ставить задани в очередь вместо их выполнения

Можно ли как-то с помощью 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 секунд.

→ Ссылка