2011-09-14 47 views
1

我正在通過django的芹菜(版本2.3.2)運行多個模擬任務。芹菜任務不會被撤銷

在views.py:

result = setup_simulations.delay(parameters) 
request.session['sim'] = result.task_id # Store main task id 

在tasks.py:仿真得到另一個任務設置

@task(priority=1) 
def setup_simulations(parameters): 
    task_ids = [] 
    for i in range(number_of_simulations): 
     result = run_simulation.delay(other_parameters) 
     task_ids.append(result.task_id) 
    return task_ids 

初始任務後(setup_simulations)已經完成,我試着撤銷模擬任務如下:

main_task_id = request.session['sim'] 
main_result = AsyncResult(main_task_id) 
# Revoke sub tasks 
from celery.task.control import revoke 
for sub_task_id in main_result.get(): 
    sub_result = AsyncResult(sub_task_id); sub_result.revoke() # Does not work 
    # revoke(sub_task_id) # Does not work neither 

當我看着「python manage.py celeryd - 信息「,任務就像沒有任何事情一樣被執行。任何想法有人可能會出錯?

+0

這個問題是否可以取決於我使用Kombu作爲經紀人的事實? (這些「虛擬傳輸」可能具有有限的廣播和事件功能,例如遙控命令僅適用於AMQP和Redis。) – Meilo

回答

1

正如您在評論中提到的那樣,revoke是一個遠程控制命令,因此它目前僅支持amqp和redis傳輸。如果你的任務是開發一些模型

from celery import states 
from celery import task 
from celery.exceptions import Ignore 

from myapp.models import RevokedTasks 


@task 
def foo(): 
    if RevokedTasks.objects.filter(task_id=foo.request.id).count(): 
     if not foo.ignore_result: 
      foo.update_state(state=states.REVOKED) 
     raise Ignore() 

,你甚至可以存儲一個標誌在於:

您可以通過在數據庫中存儲撤銷標誌,e.g做到這一點你自己。

+0

感謝您確認我對Kombu的懷疑。我不確定是否是這種情況,因爲Kombu確實是AMQP消息傳遞框架。非常感謝您的提議,我想我會選擇那個解決方案! – Meilo

+0

有沒有辦法使用此解決方法撤銷以前計劃的任務? – Fitoria

+0

我更新了示例以使用「Ignore」,這是Celery 3.0.11中的新增功能。這使得工作人員在返回後忽略任務,從而離開任務的狀態。 – asksol