2014-09-23 80 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