worker_shutdown
仅由而MainProcess
不是子池工作人员发送。所有worker_*
信号except for worker_process_init
,请参阅MainProcess
。
但是,关闭挂钩永远不会被调用。Ctrl-C’ing worker不会终止任务,我必须从shell手动终止它。
工作者永远不会在正常(热)关机下终止任务。即使一项任务需要花费数天才能完成,工作人员也要等到完成后才能完成关机。您可以设置--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)