2013-03-26 3 views
1

그래서 작업 디렉토리를 만들고 모든 작업을 수행합니다. 작업이 서버 A에서 호출되고 작업자 서버에서 실행됩니다.task_revoked 처리기의 샐러리 작업 ID

일단 작업이 완료되면/이 취소되었음을 확인해야합니다..

나는 작업 취소 처리기를 추가는 다음과 같습니다

@task 
def my_task(value): 

    task_id = current_task.request.id 
    work_dir = os.path.join(BASE_WORK_DIR, task_id) 
    os.makedirs(work_dir) 

    try: 
     # Do work... 
    finally: 
     shutil.rmtree(work_dir) 


@task_revoked.connect(sender=my_task) 
def my_task_revoked_handler(*args, **kwargs): 
    # FIXME: delete work_dir 

    print args 
    #() 

    print kwargs 
    # {'terminated': True, 'signal': <Signal: Signal>, 'expired': False, 'sender': <@task: myapp.core.tasks.my_task>, 'signum': '15'} 

내 문제는 서버 A가 작업을 취소 할 때 아무튼 이후로는 취소 처리기에서 작업 디렉토리의 정리를 발행 할 수 없다 task_id가 없습니다.

이 특정 신호 처리기에서 작업 ID를 가져 오는 방법이 있습니까? 일부 other Signals이 신호를 가지고 있는데, 나는이 신호가 어디에서 발령되었는지 소스를보고, 어떤 이유로이 신호는 task_id와 함께 제공되지 않습니다.

제공된 sender 작업에는 trace_task 함수가 포함되어 있습니다. {'__trace__': <function trace_task at 0x3ee8230>}하지만 함수 자체에 task_id가 필요하므로 어떻게 사용할 수 있는지 알 수 없습니다.

다른 아이디어를 환영합니다.

답변

1

나는이 첫 번째 "요청"인수를 지원하지 않는 이전 버전의 셀러리를 사용하고 있다고 생각합니다.

추가 된 업스트림 문제는 [1]입니다. 그 전에는 운이 없으므로 불행히도 task_id를 얻을 수있는 방법이 없다고 생각합니다.

[1] https://github.com/celery/celery/issues/1555

+0

내가 생각하기에 = – JayLev