#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()