2012-03-01 2 views
3

셀레를 처음 접했고 아직 작성하지 않은 작업자를위한 디자인 패턴 (또는 예제 코드)에 약간의 도움을 주시면 감사하겠습니다.End Celery 작업 시간 제한, 작업 단계 또는 클라이언트로부터의 지시

다음은 작업자가 원하는 특성에 대한 설명입니다.

  • 작업자는 무한 소스 인 생성기에서 데이터를 수집하는 작업을 실행합니다.
  • 작업자 작업은 중지 지시가없는 한 발전기에서 영원히 공급을 실행합니다.

다음 작업 중 하나가 발생하면 작업자 작업이 정상적으로 중지되어야합니다.

  1. 실행 제한 시간 (초)을 초과했습니다.
  2. 끝없는 생성자 루프의 반복 횟수를 초과합니다.
  3. 클라이언트가 작업자 작업을 즉시 완료하라는 메시지를 보냅니다. 다음은

내가 트리거 시나리오 1과 2

을 내가 모르는 것은 내가 클라이언트와 방법에서 '완료 즉시'신호를 보내는 방법입니다 처리 할 필요가 생각하는 방법에 대한 몇 가지 sudo는 코드 작업자 태스크에서 수신되어 실행됩니다.

조언이나 샘플 코드를 보내 주시면 감사하겠습니다.

from celery.task import task 
from celery.exceptions import SoftTimeLimitExceeded 

COUNTLIMIT = # some value sent to the worker task by the client 

@task() 
def getData(): 
    try: 
     for count, data in enumerate(endlessGeneratorThing()): 
      # process data here 
      if count > COUNTLIMIT: # Handle trigger scenario 2 
       clean_up_task_nicely() 
       break 
    except SoftTimeLimitExceeded: # Handle trigger scenario 1 
      clean_up_task_nicely() 
+0

취소 작업을 실행하면 작업을 종료 할 수 있습니다. http://stackoverflow.com/questions/8920643/cancel-an-already-executing-task-with- 셀러리/8924116 # 8924116 – mher

답변

1

내 이해는 취소하기 전에 작업을 취소한다는 것입니다.) (당신이 task.abort 호출 할 수있는 클라이언트 측에

http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable.html

: (3), 난 당신이 작업을 종료하기 위해 협력 방법을 제공하는 AbortableTask을 사용한다 수행 할 작업을 생각 들어 작업 끝에서 task.is_aborted()를 폴링 할 수 있습니다.