如何在工作者关闭时向正在运行的任务发送消息?

时间:2019-04-01 19:16:42

标签: celery

我有一项任务可能需要几个小时才能完成。但是,可以通过在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中执行此操作,但是仍然没有调用我的处理程序。 (即使它被称为,这也会令人讨厌,因为每个工作进程都可能会设置该标志,但是我只需要设置一次即可。无害,但令人讨厌。)


还有其他信号可以设置我的“提前退出”标志吗?或其他解决此问题的建议?

1 个答案:

答案 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})')

当工作程序开始关闭过程时调度。像魅力一样工作...