2014-09-23 2 views
2

하위 작업 (예 : 아래)의 복잡한 구조가 포함 된 서명이있는 경우 나중에 DependencyGraph를 다시 만들 수 있도록 작업 간의 모든 관계를 기록하는 방법이 있습니까?Celery에서 로깅 작업 관계

예컨대

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

아마 모든 작업과 해당 상위 작업 ID의 ID를 캡처하여 기록 할 수 있습니까? 일반적인 방법으로이 작업을 수행 할 수 있습니까? 예 : task_postrun 또는 Task baseclass에있는 것이 있습니까?

내 진짜 목적은 하위 작업 중 하나에 오류가있는 경우 쉽게 발생한 위치를 알려주는 것입니다 (예 : 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 : 작업 C에 대한

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)) 

하위 이름 :

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

내가 그들을 로그인 할 수 있도록 그래프 개체에서 모든 작업 ID를 얻을 수도 있습니다 ? –

+0

@TomFerguson 가능합니다. 위의 예제를 새로 추가했습니다. – ChillarAnand

+0

잘 작동합니다. 감사! –