2012-01-19 119 views
65

我一直在閱讀文檔和搜索,但似乎無法找到一個直接的答案:用Celery取消已經執行的任務?

你可以取消一個已經執行的任務嗎? (如任務已經開始,需要一段時間,並且需要取消通過它的一半)

我發現這個從文檔在Celery FAQ

>>> result = add.apply_async(args=[2, 2], countdown=120) 
>>> result.revoke() 

但我不清楚這是否會取消排隊任務或者它是否會殺死一個工作者正在運行的進程。感謝您的任何光線!

回答

116

撤銷取消任務執行。如果任務被撤銷,工作人員忽略任務並且不執行任務。如果你不使用持久性撤銷,你的任務可以在工人重新啓動後執行。

http://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistent-revokes

撤銷有一個終止選項,這是默認。如果您需要終止正在執行的任務,您需要將終止設置爲True

>>> from celery.task.control import revoke 
>>> revoke(task_id, terminate=True) 

http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks

+0

這正是我正在尋找的解釋,謝謝! – dcoffey3296

+0

這是否在分佈式環境中工作?我的意思是如果我有多個正在執行任務的機器上的工作人員。芹菜是否跟蹤執行任務的機器? – ksrini

+0

它的確如此。與工人的溝通通過經紀人進行。 – mher

24

在芹菜3.1中,API of revoking tasks被改變。

按照Celery FAQ,你應該使用result.revoke:

>>> result = add.apply_async(args=[2, 2], countdown=120) 
>>> result.revoke() 

,或者如果你只有任務ID:

>>> from proj.celery import app 
>>> app.control.revoke(task_id) 
12

@ 0x00mh的答案是正確的,但是最近的芹菜docs說使用terminate選項爲「是管理員的最後一招」,因爲您可能會意外終止在此期間開始執行的其他任務。可能更好的解決方案是將terminate=Truesignal='SIGUSR1'(這會導致在任務中引發SoftTimeLimitExceeded異常)相結合。

相關問題