34

セロリは例外を適切に処理していないようです。

タスクがある場合:

def errorTest():
    raise Exception()

そして、私は電話します

r = errorTest.delay()
In [8]: r.result

In [9]: r.state
Out[9]: 'PENDING'

そして、それは無期限にこのようにぶら下がります。

ログにアクセスして確認すると、タスクでエラーがスローされていることがわかります (メッセージが必要な場合は質問してください)。バックエンドとすべてが適切にセットアップされていることがわかります。これは、他のタスクが正常に動作し、結果が正しく返されるためです。

セロリで例外をキャッチするために何かファンキーなことをする必要がありますか?

/Celery のバージョンは 3.0.13、ブローカーはローカル マシンで実行されている RabbitMQ です

4

4 に答える 4

39

CELERY_ALWAYS_EAGER を True に設定して Celery を実行している場合は、設定に次の行も含めてください。

CELERY_EAGER_PROPAGATES_EXCEPTIONS = True

http://docs.celeryproject.org/en/latest/configuration.html#celery-eager-propagates-exceptions

于 2014-06-16T11:54:22.880 に答える
15

on_failureサブクラスで関数を定義して、Taskそれらを正しく処理できます。何が起こったのかを知りたいだけの場合は、セロリの設定でスタック トレースを送信するエラー メール通知を設定できます。

注: v4 以降、Celery は電子メールの送信をサポートしなくなりました。

于 2013-02-06T07:39:10.763 に答える
2

@primalpython の回答をより明確にする予定です。

これは失敗します:

@task
def error():
    raise Exception

入出力:

In [7]: r = error.delay()

In [8]: print r.state
Out[8]: 'PENDING'

In [9]: print r.result
Out[9]: None

これは成功します:

@task
def error():
    raise Exception

    def on_failure(self, *args, **kwargs):
        pass

入出力:

In [7]: r = error.delay()

In [8]: print r.state
Out[8]: 'FAILURE'

In [9]: print r.result
Out[9]: Exception()
于 2013-02-06T19:35:54.097 に答える
1

これを行う最も簡単な方法は、新しい Celery アプリケーションを作成するときに使用するタスク クラスへの参照を渡すことです。

1 つのモジュールで、デフォルトで使用するタスク クラスを定義します。

from celery.app.task import Task
import logging

logger=logging.getLogger(__name__)

class LoggingTask(Task):
  def on_failure(self, exc, task_id, args, kwargs, einfo):
      kwargs={}
      if logger.isEnabledFor(logging.DEBUG):
         kwargs['exc_info']=exc
      logger.error('Task % failed to execute', task_id, **kwargs)
      super().on_failure(exc, task_id, args, kwargs, einfo)

アプリを定義するときは、モジュールを参照します (これは、提供する文字列参照です..):

from celery import Celery

app=Celery('my_project_name', task_cls='task_package.module_name:LoggingTask')

それ以降、特にタスク クラスが指定されていない場合は、LoggingTask が使用されます。これにより、各タスクを変更するのではなく、(デフォルトを使用する) 既存のすべてのタスクに影響を与えることができます。これは、 @shared_task デコレーターを通常どおり使用できることも意味します。

于 2018-07-25T11:29:44.363 に答える