2013-01-11 4 views
4

셀러리 3.0.12를 사용하고 있습니다.파이썬 셀러리 작업이 백엔드없이 완료되었습니다.

두 대기열이 있습니다 : Q1, Q2.

일반적으로 Q2에 들어가는 하위 작업을 호출하는 주 작업을 Q1에 넣습니다. 하위 작업의 결과를 저장하고 싶지 않습니다. 그래서 내 하위 작업에는 데코레이터 @celery.task (ignore_results = True)가 있습니다.

내 주요 작업은 이제 하위 작업이 완료 될 때까지 대기해야합니다. 나는 결과를 쓰지 않기 때문에. 사용할 수 없습니다 : AsyncResult. 하위 태스크가 백엔드에 상태를 저장하지 않고 완료 될 때까지 대기하도록 기본 태스크에서 대기하는 방법이 있습니까? AsyncResults를 사용하는 모든 시도는 성공한 것이 아니며 백엔드에 의존합니다. get()도 백엔드에 의존합니다. 코드에서

전체 기사 :

@celery.task(ignore_result=True) 
def subtask(): 
    #Do something 

@celery.task 
def maintask(): 
    # Do something 

    # Call subtask on Q2: 
    res = subtask(options={'queue':'Q2'}).delay() 

    # Need to wait till subtask finishes 
    # NOT WORKING (DOES NEVER RETURN) 
    res.get() 

나는 셀러리 꽃과 함께 전체 응용 프로그램을 모니터링 그리고 난 그 하위가 successfuelly 마무리되어 볼 수 있습니다. 셀러리가 어떻게 그 상태를 감지 할 수 있습니까? 나는 그들의 코드를 찾아 보았지만 그들이 어떻게 탐지 하는지를 알 수 없었다.

답변

3

내 주요 작업은 이제 하위 작업이 완료 될 때까지 대기해야합니다.

이 기아와 교착 상태를 (다른 작업을 기다리는 모든 작업,하지만 더 이상 노동자들을 처리하기 위해) 자원으로 이어질 수 있으므로 당신은 하위 대기해서는 안됩니다.

하위 작업이 완료되면 콜백을 사용하여 추가 작업을 수행해야합니다 (셀러리 사용 설명서의 캔버스 가이드 참조).

셀러리 꽃을 사용하여 전체 응용 프로그램을 모니터링 중이며 서브 타스크가 결승전에서 끝났음을 알 수 있습니다. 셀러리가 어떻게 그 상태를 감지 할 수 있습니까? 나는 그들의 코드를 찾아 보았지만 그들이 어떻게 탐지 하는지를 알 수 없었다.

꽃과 다른 모니터를 사용하지 않는 결과 (작업 상태), 대신 그들은 우리가 이벤트를 부르는 것을 사용한다.

작업자가 특정 작업을 수행 할 때 이벤트 메시지가 방출되며 이는 일시적인 메시지 스트림이됩니다. 프로세스는 특정 이벤트 (또는 모든 이벤트)를 구독하여 클러스터를 모니터링 할 수 있습니다.

  • 이벤트 (과도) 지속되지 않습니다, 때문에

    이벤트는 이벤트를 누락

    는 대 실패로 간주되지 않는 작업 상태에서 별개입니다.

  • 복잡한 필드는

    이벤트 진단 및 정보 제공 목적으로 직렬화하지 않고, 단지 이들의 repr()이 있는지 확인하기 위해 저장 될 때, 작업의 반환 값 또는 예를 들어 예외를 성찰하는 을 사용할 수 없습니다 모니터 은 다른 언어로 작성 될 수 있으며 큰 필드는 잘림을 줄여 의 전송 속도를 높일 수 있습니다.

+0

감사합니다. 올바른 힌트였습니다. – foobar

관련 문제