2011-11-15 2 views
5

저는 파이썬 2.6, rabbitmq 백엔드 및 django에서 셀러리 2.4.1을 사용하고 있습니다. 작업자가 종료하면 작업을 올바르게 정리할 수 있기를 바랍니다. 제가 아는 한 당신은 작업 소멸자를 제공 할 수 없으므로 worker_shutdown 신호에 연결하려고했습니다.작업자 종료의 셀러리 작업에 알립니다.

참고 : AbortableTask은 데이터베이스 백엔드에서만 작동하므로 사용하지 마십시오.

from celery.signals import worker_shutdown 

@task 
def mytask(*args) 

    obj = DoStuff() 

    def shutdown_hook(*args): 
    print "Worker shutting down" 
    # cleanup nicely 
    obj.stop() 

    worker_shutdown.connect(shutdown_hook) 

    # blocking call that monitors a network connection 
    obj.stuff() 

그러나 종료 훅은 절대로 호출되지 않습니다. Ctrl-C'ing 작업자가 작업을 죽이지 않고 수동으로 쉘에서 종료해야합니다.

이렇게 적절한 방법이 아닌 경우 작업을 정상적으로 종료하도록하려면 어떻게해야합니까?

답변

10

worker_shutdown은 하위 풀 작업자가 아닌 MainProcess에 의해서만 전송됩니다. 모두 worker_* 신호 except for worker_process_initMainProcess을 참조하십시오.

그러나 종료 훅은 결코 호출되지 않습니다. Ctrl-C'ing worker 작업을 죽이지 않고 수동으로 쉘에서 kill해야합니다.

정상적인 (웜) 종료시 작업자가 작업을 종료하지 않습니다. 작업을 완료하는 데 며칠이 걸리는 경우에도 작업자는 완료 될 때까지 종료를 완료하지 않습니다. --soft-time-limit 또는 --time-limit에서 으로 설정하면 작업을 종료해도 괜찮은지 인스턴스에 알릴 수 있습니다.

그래서 어떤 종류의 프로세스 정리 프로세스를 추가하려면 먼저 에 작업이 실제로 완료 될 수 있어야합니다. 그 일이 일어나기 전에 정리가 호출되지 않기 때문에 이 호출됩니다. 노동자에서 중지하는 방법 작업을 통지

from celery import platforms 
from celery.signals import worker_process_init 

def cleanup_after_tasks(signum, frame): 
    # reentrant code here (see http://docs.python.org/library/signal.html) 

def install_pool_process_sighandlers(**kwargs): 
    platforms.signals["TERM"] = cleanup_after_tasks 
    platforms.signals["INT"] = cleanup_after_tasks 

worker_process_init.connect(install_pool_process_sighandlers) 
+4

어떤 아이디어 :

풀 노동자에 대한 정리 단계는 같은 뭔가를 사용할 수 있습니다 처리 추가하려면? –

+0

@RomanPodlinov -'revoke()''에 대한 Celery 문서를 살펴 보라. 선택적으로 작업자가 정리하기 위해 잡을 수있는 신호를 보낼 수있다. – RichVel

+0

나는 그것을 얻지 않는다. '--soft-time-limit'이 끝난 후에 어떤 신호가 방출되고 있습니까? 그렇다면 어느 것입니까? –

관련 문제