我在Heroku上,因此在发送SIGTERM
信号时只有10秒钟关闭所有任务。我的一些任务将创建一次运行几分钟的子进程。这些任务可以在中途关闭。终止任务及其子进程的最佳方法是什么?
我的第一个方法是在工作人员的SIGTERM
信号上注册一个监听器(MainProcess)。从那里,它将撤销my_long_running_task_that_i_can_safely_end
类型的所有正在运行的任务。我还考虑过发送app.control.broadcast('shutdown')
来关闭所有工作进程。
在我的任务中,我会为SIGTERM
信号注册一个监听器并优雅地关闭它。
这是我到目前为止所得到的:
from celery.signals import worker_ready
from celery import platforms
worker_ready.connect(endit)
old_term = None
old_int = None
def endit(**kwargs):
global old_term
global old_int
old_term = platforms.signals[signal.SIGTERM]
old_int = platforms.signals[signal.SIGINT]
platforms.signals[signal.SIGTERM] = signal_term_handler
platforms.signals[signal.SIGINT] = signal_term_handler
def signal_term_handler(signal, frame):
active = app.control.inspect().active()
# ****** active == None here ---- This is not what I expect ******
app.control.broadcast('shutdown')
# ****** This did not appear to shutdown my worker processes either ******
if signal == 2:
old_int(signal, frame)
elif signal == 15:
old_term(signal, frame)
我遇到的问题是app.control.inspect().active()
返回None
。 app.control.broadcast('shutdown')
似乎没有关闭工作进程。
这是最好的appraoch吗?我觉得好像有很多方法可以做到这一点,我不想走错路。
由于