在高级工作流程中获取芹菜任务ID

时间:2014-03-29 09:36:07

标签: python celery

我需要实现以下方案:

  • 执行任务A.
    • 与不同参数并行执行多个任务B
    • 等待所有任务完成
    • 与不同参数并行执行多个任务B
    • 等待所有任务完成
    • 执行任务C

我通过实现和弦实现了这一点,这里是简化代码:

# inside run() method of ATask
chord_chain = []
for taskB_group in taskB.groups.all():
  tasks = [BTask().si(id=taskB_model.id) for taskB_model in taskB_group.children.all()]
  if len(tasks):
    chord_chain.append(chord(tasks, _dummy_callback.s()))
chord_chain.append(CTask().si(execution_id))
chain(chord_chain)()

问题是我需要能够在任何时间点在所有BTasks上调用revoke(terminate = True)。较低级别的问题是我无法访问BTask celery ID。

  1. 试图通过链result = chain(chord_chain)()获取BTask ID。但是我没有在返回的AsyncResult对象中找到该信息。是否有可能从这个对象获得链子id? (result.children是无)
  2. 尝试通过ATask AsyncResult获取BTask ID,但似乎children属性仅包含第一个和弦的结果,而不包含其余任务。
  3. >>> r=AsyncResult(#ATask.id#)
    >>> r.children
    [<GroupResult: 5599ae69-4de0-45c0-afbe-b0e573631abc [#BTask.id#, #BTask.id#]>, 
    <AsyncResult: #chord_unlock.id#>] 
    

1 个答案:

答案 0 :(得分:0)

通过使用中止状态标志标记ATask相关模型并在BTask开始时添加检查来解决。