优雅地停止芹菜任务

时间:2013-05-11 03:09:02

标签: python celery django-celery celery-task

我想优雅地退出芹菜任务(即不是通过致电revoke(celery_task_id, terminate=True))。我以为我会向设置标志的任务发送消息,以便任务函数可以返回。什么是与任务沟通的最佳方式?

2 个答案:

答案 0 :(得分:7)

使用信号。 Celery的revoke 正确的选择;它默认使用SIGTERM,但如果您愿意,可以使用signal参数specify another

只需在您的任务中设置一个信号处理程序(使用signal module)即可正常终止任务。

答案 1 :(得分:7)

您也可以使用AbortableTask。我认为这是最好的方法 优雅地停止任务。

http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable.html

from celery.contrib.abortable import AbortableTask
from proj.celery import app

@app.task(bind=True, base=AbortableTask)
def abortable_task(self):
    while not self.is_aborted():
       print 'I am running'

    print 'I was aborted!'

如果你在某个地方保存id任务,你可以随时调用它。

from celery.contrib.abortable import AbortableAsyncResult

abortable_task = AbortableAsyncResult(task_id)
abortable_task.abort()