首页 > 解决方案 > 在 celery worker 退出之前对 KeyboardInterrupt 执行一些操作

问题描述

当遇到键盘中断(比如 SIGINT)时,有没有办法在退出 celery worker 之前执行一些操作?我曾尝试在我的任务中使用信号模块,如下所示:

signal.signal(signal.SIGINT, keyboard_interrupt_handler)

但它并不像我期望的那样工作。确实会执行,keyboard_interrupt_handler但由于执行需要几秒钟,因此该进程在完成执行之前就终止了。

我也尝试过暂时阻止SIGINT信号signal.pthread_sigmask并在线程中运行处理程序(因为它们不能被杀死?),但它也面临同样的问题。

有没有办法实现这样的目标?

标签: pythonpython-3.xcelerycelerybeat

解决方案


我建议您尝试为worker-shutdown signal实现一个处理程序。一般来说,Celery 信号非常有用,Celery 用户应该熟悉它们,Celery 事件也是如此。

示例代码:

app = Celery('my_tasks', include['my_tasks.tasks', 'their_tasks.tasks'])

@worker_shutdown.connect
def handle_worker_shutdown(**kwargs):
    mymodule.handle_worker_shutdown(app, _LOGGER, **kwargs)

推荐阅读