我试图将芹菜任务设置为由celerybeat调用的Django站点的一部分,该站点运行处理管道的几个步骤。
第一步下载数据文件,第二步绘制这些文件中的数据,第三步将这些图切成谷歌地图的图块。
第一步只是一项任务,但第二步和第三步是任务组,因为每个数据文件都有数十个图。
我想做的是让celerybeat调用像
这样的任务@shared_task
def pipeline():
job = chain(download.s(), get_plot_task_group().s(), spacer.s(), tile.s())
result = job.apply_async()
return result
其中间隔是芹菜等待绘图小组在平铺之前完成小组中的所有任务所必需的,如下所述:celery - chaining groups and subtasks. -> out of order execution
问题是,get_plot_task_group()需要有关数据文件的信息来构建任务组,但celery会立即执行它,而不是在download.s()完成后执行。有没有办法告诉芹菜等待调用该功能?
我也试过让get_plot_task_group本身成为一个返回组的任务,但我无法在链中或链完成后调用该组。我必须调用result.get()来获取组对象,并在任务中调用result.get()是不好的做法。我无法看到使用回调的方法。
我很欣赏你的任何见解。
tl; dr:我必须在另一个任务中创建一组任务,然后运行它,但我不确定如何。
答案 0 :(得分:4)
将您的群组任务转换为和弦以实现此目的。这是一个简单的例子。
@app.task
def dummy_task():
return 'I am a dummy task'
@app.task
def add(x, y):
return x + y
@app.task
def task_with_group_task():
task1 = add.si(1, 2)
group_task = group(add.si(i, i) for i in range(5))
task2 = chord(group_task, dummy_task.si())
task3 = add.si(9, 9)
pipeline = chain(task1, task2, task3)()
此处task2仅在task1完成后启动,task3仅在task2完成后启动。
注意:我没有将一项任务的结果传递给另一项任务。