我有一项任务可能需要几个小时才能完成。但是,可以通过在memcached中设置一个标志来通知它彻底退出ASAP。任务定期轮询标志,当发现任务时,将保存其状态并干净地退出。如果我只是手动设置缓存中的标志,这一切都很好。
我想用它来及时关闭工作人员,我只需要知道在哪里放置标志设置逻辑。这是我尝试过的:
worker_shutdown
处理程序我尝试将其放在worker_shutdown
处理程序中,但是看起来只有在所有任务完成后才被称为。因此,这对关闭我长期运行的任务没有帮助。
celery.platforms.signals
的信号处理程序我尝试使用celery.platforms.signals
接口附加TERM和INT信号处理程序,但从未调用我的处理程序:
@worker_init.connect
def handle_worker_init(*args, **kwargs):
platforms.signals["TERM"] = handle_worker_shutdown
platforms.signals["INT"] = handle_worker_shutdown
def handle_worker_shutdown(*args, **kwargs):
logger.info("Setting database cleanup stop flag to save our ship")
database_cleanup_stop()
我也尝试在worker_process_init
中执行此操作,但是仍然没有调用我的处理程序。 (即使它被称为,这也会令人讨厌,因为每个工作进程都可能会设置该标志,但是我只需要设置一次即可。无害,但令人讨厌。)
还有其他信号可以设置我的“提前退出”标志吗?或其他解决此问题的建议?
答案 0 :(得分:0)
使用worker_shutting_down信号:
from celery.signals import worker_shutting_down
@worker_shutting_down.connect
def worker_shutting_down_handler(sig, how, exitcode, ** kwargs):
print(f 'worker_shutting_down({sig}, {how}, {exitcode})')
当工作程序开始关闭过程时调度。像魅力一样工作...