22

タスクの再試行で問題が発生しました。テストタスクは次のようになります。

from celery.decorators import task

@task()
def add(x, y):
    if not x or not y:
        raise Exception("test error")
    return x+y

装飾されたタスクを再試行する方法に関するドキュメントがまったく見つかりません。見つけたのはこれだけです。

self.retry(x,y, exc=exception, countdown=30)

selfメソッドから渡される変数がないため、これは私の場合には機能しないようです。

編集:

私は今、無駄に次のことを試みています:

from celery.decorators import task

@task()
def add(x, y):
    if not x or not y:
        try:
            raise Exception("test error")
        except Exception, e:
            add.retry([x, y], exc=e, countdown=30)
    return x+y

次のエラーが発生します。

TypeError("再試行のkwargs引数を空にすることはできません。タスクは**kwargsを受け入れる必要があります。http://bit.ly/cAx3Bgを参照してください"、)

4

2 に答える 2

27

デコレータで再試行パラメータを設定できます。

@task(default_retry_delay=5 * 60, max_retries=12)
def foo(bar):
  try:
      ...
  except Exception, exc:
      raise foo.retry(exc=exc)
于 2013-03-04T12:39:09.827 に答える
17

タスクはキーワード引数を受け入れる必要があります。これらの引数は、特に再試行回数に関する情報を渡すために使用されます。コードは次のようになります。

from celery.decorators import task

@task()
def add(x, y, **kwargs):
    if not x or not y:
        try:
            raise Exception("test error")
        except Exception, e:
            add.retry(args=[x, y], exc=e, countdown=30, kwargs=kwargs)
    return x+y

**kwargsadd関数のシグニチャに追加し、kwargs=kwargsretryを呼び出すときと同じように渡す必要があります。

注:このスタイルは、celery2.2のリリースで非推奨になりました

于 2011-02-04T22:15:23.173 に答える