2013-05-11 96 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()