2011-10-06 16 views
22

状況によっては、そのタスク内からセロリのタスクを失敗させたいと思っています。私は次のことを試してみました:タスク内からセロリのタスクを失敗させる方法は?

from celery.task import task 
from celery import states 

@task() 
def run_simulation(): 
    if some_condition: 
     run_simulation.update_state(state=states.FAILURE) 
     return False 

しかし、タスクがまだ成功したと報告します。

タスクsim.tasks.run_simulation [9235e3a7-c6d2-4219-bbc7-acf65c816e65] が1.17847704887sに成功しました:タスクの実行中に、それが完了すると状態のみを変更することができるように思わ

偽 - セロリはそれがあると考えるものは何でも状態が変化は(this question参照)結果です。タスクを失敗したことをセラーに返すように、例外を発生させてタスクを失敗させることなく、何らかの方法がありますか?

+0

は、あなたのコード内から例外を発生しようとしたことがあり:FAILUREとタスクの状態を更新し、任意の値を返すことに成功し、一例として、タスクを記録しますので、その後、Ignore例外を発生させるのですか? – hymloth

+0

@hymloth例外が発生すると、実際にはタスクが失敗します。これには、毎回電子メールが送信されます。これは避けたいものです。申し訳ありませんが、私は今質問を変更しました。 – Meilo

答えて

2

私はこの問題に関してAsk Solemからinteresting replyを受け取りました。ここで彼は問題を解決するための 'after_return'ハンドラを提案しています。これは将来にとって興味深い選択肢かもしれない。一方

私はそれが次のようにそのためにチェックし、次に失敗し、作成したいとき、単にタスクから文字列「FAILURE」を返すことによってこの問題を解決:

result = AsyncResult(task_id) 
if result.state == 'FAILURE' or (result.state == 'SUCCESS' and result.get() == 'FAILURE'): 
    # Failure processing task 
+0

あなたは条件がREADY_STATESの 'result.state | EXCEPTION_STATES: 'where' from celery.states import READY_STATES、EXCEPTION_STATES、UNREADY_STATES' –

14

これを行うには良い方法

from celery import Celery, states 
from celery.exceptions import Ignore 

app = Celery('tasks', broker='amqp://[email protected]//') 

@app.task(bind=True) 
def run_simulation(self): 
    if some_condition: 
     # manually update the task state 
     self.update_state(
      state = states.FAILURE, 
      meta = 'REASON FOR FAILURE' 
     ) 

     # ignore the task so no other state is recorded 
     raise Ignore() 
+0

これはtask_failureシグナルをトリガーしないので、それらにアタッチしたいハンドラは起動されません。 –

関連する問題