Выполните ту же задачу с сельдереем в цикле

#python #celery

Вопрос:

как правильно выполнить такую задачу с сельдереем?

 @app.task
def add(x)
    x   1


def some_func():
    result = 'result'
    for i in range(10):
        task_id = uuid()
        add.apply_async((i,)), task_id=task_id)
    return result
 

Мне нужно, чтобы все задачи выполнялись последовательно после завершения предыдущей.
Я попытался использовать time.sleep (), но в этом случае возвращаемый результат ожидает завершения всех задач. Но мне нужен возвращенный результат, и все 10 задач выполняются последовательно в фоновом режиме.

в сельдерее есть группа (), но она выполняет задачи параллельно

Комментарии:

1. Попробуйте цепочки , но будет зависеть от того, что вы пытаетесь выполнить, возможно, вам нужны периодические задачи.

Ответ №1:

Если функция some_func() выполняется вне Сельдерея (скажем, сценарий используется в качестве «производителя», чтобы просто отправлять эти задачи на выполнение), то ничто не мешает вам вызвать .get() на AsyncResult, чтобы дождаться завершения задачи, и повторять это столько, сколько вам нравится.

Однако, если вы хотите выполнить этот цикл как своего рода рабочий процесс сельдерея, вам нужно построить цепочку и использовать ее.

Комментарии:

1. Когда я использую .get (), он ждет, пока все задачи не будут завершены. Но мне нужно вернуть результат, но запускать задачи в фоновом режиме. Итак, для этого мне нужно использовать цепочку?

2. Да, как кажется, это часть рабочего процесса Сельдерея.

Ответ №2:

Наконец, я решил эту проблему, используя неизменяемую подпись и цепочку

 tasks = [
    add.si(x).set(task_id=uuid())
    for x in range(10)
]
chain(*tasks).apply_async()