可以在循环中向和弦添加任务吗?

时间:2017-06-21 15:11:05

标签: python celery

我发现的大多数和弦例子都在这一行:

res = chord([add.s(2, 2), add.s(4, 4)])(sum_task.s())

chord(add.subtask((i, i))
...     for i in xrange(100))(tsum.subtask()).get()

我目前有一段代码可以解雇任务:

for node in self.simulationRecord.fields['departureNodes']:
    passengers = int(outgoing_seat_counts.get(node, 0)) 
    # send the job to the queue
    res = tasks.my_task.delay(passengers, start_date, end_date)
    task_ids.append(res.id)

我想转换为使用和弦,但我无法根据我看到的例子,弄清楚如何将当前结构转换为使用和弦。如何将带有参数的my_task的每个调用添加到和弦?

2 个答案:

答案 0 :(得分:1)

您可以从任务列表和回拨中调用chord。例如,如果你有一个添加功能,那么你可以像这样调用和弦

tasks = []

for i in range(10):
    tasks.append(add.s(i, i))

callback = add.si(100, 100)

chord_result = group(tasks)(callback)

答案 1 :(得分:0)

我最后将我的代码更改为下面的代码以使用和弦。基本上我在循环中构建参数列表,然后使用它创建和弦:

arg_list = []
for node in self.simulationRecord.fields['departureNodes']:
    passengers = int(outgoing_seat_counts.get(node, 0)) 
    arg_list.append({'passengers': passengers})
res = chord(tasks.my_task.s(i['passengers'],start_date,end_date) for i in arg_list)(tasks.callback.s())
task_ids = [task.id for task in res.parent.results]