1

Celery と Django を使用してきましたが、失敗したタスクを再試行する必要がある場合を除いて、すべてうまくいっています。

例外が発生し、タスクが再度送信されることはありません(セロリフラワーで見たものによると)

これが私がタスクを宣言した方法です

# Enqueue this on "my_cool_queue", retry it no more than ten times and delay the retries by 10 seconds
@celery.task(queue='my_cool_queue', max_retries=10, default_retry_delay=10)
def task(arg1, arg2):
    try:
    # do some things with arg2 and arg2
    except suds.WebFault, fault:
        task.retry(exc=fault, args=[arg1, arg2], queue='my_cool_queue')

このコマンドでセロリを実行しています

python manage.py celeryd --concurrency=2 -B -Q my_cool_queue,cron -l INFO

ユーザーが生成したすべてのタスクを配置する my_cool_queue と、スケジュールされたすべてのタスクを配置する cron という 2 つのキューがあります。

何が足りないの??

編集:

少しセロリの再試行メソッドをデバッグすると、「called_directly」パラメーターがTrueのデフォルトコンテキストを受け取るため、タスクを再試行していないことがわかりました

したがって、このメソッドの最初の数行は次のようになります。

 # Not in worker or emulated by (apply/always_eager),
 # so just raise the original exception.
 if request.called_directly:
     maybe_reraise()  # raise orig stack if PyErr_Occurred
     raise exc or RetryTaskError('Task can be retried', None)

質問は「これをエレガントな方法で変更するにはどうすればよいか」かもしれないので、タスクについて直接書く必要はありません。

task.request.called_directly = False

事前にどうもありがとうございました。

4

1 に答える 1

0

これは最初から設定してはいけません。あなたの問題は、それを変更する方法ではなく、そもそもこの属性なしでタスクを呼び出す方法です。

あなたは.delayあなたの仕事をしていますか?確かに熱心なモードを使用していませんか?

どのバージョンのセロリを実行していますか?

于 2013-09-27T17:19:32.760 に答える