2011-09-14 11 views
1

私は、djangoのセロリ(バージョン2.3.2)を使って複数のシミュレーションをタスクとして実行しています。最初のタスク(setup_simulations)が完了した後、私がしようとセロリのタスクが取り消されない

@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 

:views.pyで

:tasks.pyで

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

シミュレーションは別のタスクで設定を取得します

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 - の出力を見ると、次のようになります。 l info "を指定すると、何も起こらなかったかのようにタスクが実行されます。誰か何かが間違っていた可能性がありますか?

+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() 

あなたのタスクは、いくつかのモデルで作業している場合でも、その中にフラグを格納することができます。

+0

Kombuに関する疑いを確認していただきありがとうございます。 Kombuが本当にAMQPメッセージングフレームワークなので、私はそれが本当かどうかは分かりませんでした。あなたの提案についてもありがとう、私はその解決策に行くと思います! – Meilo

+0

この回避策を使用して以前にスケジュールされたタスクを取り消す方法はありますか? – Fitoria

+0

Celery 3.0.11の新機能であるIgnoreを使用するようにサンプルを更新しました。これにより、作業者は作業が戻った後に作業を無視し、作業の状態だけを残します。 – asksol

関連する問題