2014-09-23 44 views
2

如果我有一个包含复杂子任务结构(例如下面)的签名,是否有办法记录任务之间的所有关系,以便我可以在以后重新创建DependencyGraph?在Celery中记录任务关系

例如

complex_task = group(task1 | task2 | group(task3, task4, task5 | task6), task7, task8) 

也许我可以捕获所有任务及其父任务ID的ID并记录它们?我能以通用的方式做到这一点吗?例如在task_postrun或Task基类中的东西?

我真正的目标是,如果其中一个子任务出现故障,可以轻松地告诉它发生的位置(希望通过图形方式显示任务结构,例如graphviz)。

回答

2

您可以从任务结果中生成DependencyGraph

In [4]: task_result = some_complex_task() 

In [5]: task_result.parent.parent.graph 
Out[5]: 285fa253-fcf8-42ef-8b95-0078897e83e6(1) 
      463afec2-5ed4-4036-b22d-ba067ec64f52(0) 
     872c3995-6fa0-46ca-98c2-5a19155afcf0(2) 
      285fa253-fcf8-42ef-8b95-0078897e83e6(1) 
      463afec2-5ed4-4036-b22d-ba067ec64f52(0) 

您可以将这些图表点文件:

In[22]: with open('graph.dot', 'w') as fh: 
    ...:  res.parent.parent.graph.to_dot(fh) 

如需更多信息,请查看documentation

示例 让我们打印任务的任务名称。

task_list.py:

from celery import Celery, chain 
celery_app = Celery('my_tasks', broker='amqp://', backend='amqp://') 

@celery_app.task() 
def add(x, y): 
    return x + y 

@celery_app.task() 
def sub(x, y): 
    return x - y 

c = chain(add.s(3, 4), sub.s(2)) 

的任务C SubTask类名称:

In [62]: r=c() 

In [63]: r.parent.graph 
Out[63]: 
d11c0076-a4e4-4e84-b26b-9b689860baa5(0) 
68ba78cf-7e6c-4735-9173-2349da541b28(1) 
    d11c0076-a4e4-4e84-b26b-9b689860baa5(0) 

In [64]: r.graph 
Out[64]: d11c0076-a4e4-4e84-b26b-9b689860baa5(0) 

In [65]: while r: 
    ....:  print(r.task_name) 
    ....:  r = r.parent 
    ....:  
task_list.sub 
task_list.add 
+0

是否也可以让所有的任务编号从图形对象的,这样我就可以登录他们? – 2014-09-24 14:27:39

+0

@TomFerguson是的,你可以。我已经在上面添加了新的示例。 – ChillarAnand 2014-09-25 03:58:22

+0

效果很好。谢谢! – 2014-09-26 14:35:49