如何在MainProcess接收SIGTERM时关闭任务

时间:2014-01-18 17:49:15

标签: python django celery

我在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()返回Noneapp.control.broadcast('shutdown')似乎没有关闭工作进程。

这是最好的appraoch吗?我觉得好像有很多方法可以做到这一点,我不想走错路。

由于

0 个答案:

没有答案