2013-05-11 75 views
3

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

回答

5

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

只是为其设置一个信号处理程序在任务(使用signal module)是正常终止任务。你

+0

是否可以捕捉任意信号并执行一些清理操作?另外,信号平台是独立的吗? – orange 2013-05-12 10:20:24

+0

Python的'signal'模块文件在不同的平台,不同的是在Windows上支持的唯一信号是SIGABRT,SIGFPE,SIGILL,SIGINT,SIGSEGV,或SIGTERM,所以你应该坚持的。所有这些都可以被捕获。无论何时发现任何信号都会被触发,将无法设置处理程序,如果这就是您要求的。 – Cairnarvon 2013-05-12 10:30:47

+0

我终于实现了这一点,它可以在OSX和Linux上正常工作。但是,在Windows(8)上,我似乎无法捕捉到信号。我尝试过SIGABRT和SIGTERM,但没有一个被抓到。我在'@ task'注释的函数中安装了监听器。还有什么,我需要做什么? – orange 2013-06-10 23:57:21

6

还可以使用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()