Python 通知芹菜任务工人停工

Python 通知芹菜任务工人停工,python,rabbitmq,celery,django-celery,Python,Rabbitmq,Celery,Django Celery,我将芹菜2.4.1与python 2.6、rabbitmq后端和django一起使用。如果工人停工,我希望我的任务能够正常清理。据我所知,你不能提供任务析构函数,所以我尝试连接到信号 注意:只适用于数据库后端,所以我不能使用它 from celery.signals import worker_shutdown @task def mytask(*args) obj = DoStuff() def shutdown_hook(*args): print "Worker s

我将芹菜2.4.1与python 2.6、rabbitmq后端和django一起使用。如果工人停工,我希望我的任务能够正常清理。据我所知,你不能提供任务析构函数,所以我尝试连接到信号

注意:只适用于数据库后端,所以我不能使用它

from celery.signals import worker_shutdown

@task
def mytask(*args)

  obj = DoStuff()

  def shutdown_hook(*args):
     print "Worker shutting down"
     # cleanup nicely
     obj.stop()

  worker_shutdown.connect(shutdown_hook)

  # blocking call that monitors a network connection
  obj.stuff()
但是,关闭钩子从未被调用。Ctrl-C'ing worker不会终止任务,我必须从shell手动终止它


因此,如果这不是正确的方法,如何允许任务正常关闭?

worker\u shutdown
仅由
MainProcess
发送,而不是子池worker。 所有
worker.*
信号
除worker\u process\u init
外,请参阅
MainProcess

但是,关闭钩子从未被调用。控制工人 不会终止任务,我必须从shell手动终止它

在正常(热)关机情况下,工作进程从不终止任务。 即使任务需要几天才能完成,工作人员也无法完成关机 直到它完成。您可以将
--软时限
--时限
设置为 告诉实例何时可以终止任务

因此,要添加任何类型的流程清理流程,首先需要 确保任务能够实际完成。因为清理工作不会 在这种情况发生之前打电话

要将清理步骤添加到池工作进程,可以使用 比如:

from celery import platforms
from celery.signals import worker_process_init

def cleanup_after_tasks(signum, frame):
    # reentrant code here (see http://docs.python.org/library/signal.html)

def install_pool_process_sighandlers(**kwargs):
    platforms.signals["TERM"] = cleanup_after_tasks
    platforms.signals["INT"] = cleanup_after_tasks

worker_process_init.connect(install_pool_process_sighandlers)

@RomanPodlinov-查看芹菜文档中的
revoke()
-您可以选择发送一个信号,工人可以捕捉到该信号以便进行清理。我不明白。
--软时限
结束后是否发出信号?如果是,哪一个?