いくつかのタスクを実行するセロリチェーンがあります。それぞれのタスクは失敗し、再試行できます。簡単な例は以下を参照してください:チェリーを再試行するとチェーンの一部であるタスクが失敗する
from celery import task
@task(ignore_result=True)
def add(x, y, fail=True):
try:
if fail:
raise Exception('Ugly exception.')
print '%d + %d = %d' % (x, y, x+y)
except Exception as e:
raise add.retry(args=(x, y, False), exc=e, countdown=10)
@task(ignore_result=True)
def mul(x, y):
print '%d * %d = %d' % (x, y, x*y)
とチェーン:
from celery.canvas import chain
chain(add.si(1, 2), mul.si(3, 4)).apply_async()
は、2つのタスクを実行する(そして何が失敗していないと仮定して)、あなたが取得/参照、印刷になります。
1 + 2 = 3
3 * 4 = 12
しかし、追加タスクが最初に失敗し、その後の再試行コールで成功すると、チェーン内のタスクの残りの部分は実行されません。つまり、追加タスクは失敗し、チェーン内の他のタスクはすべて実行されず、 ew秒になると、addタスクが再度実行され、チェーン内のタスク(この場合はmul.si(3、4))は実行されません。
セロリは、失敗したタスクから失敗したチェーンを継続する方法を提供しますか?そうでない場合は、これを達成し、チェーンのタスクが指定された順序で実行されるように、そしてタスクが数回再試行されても前のタスクが正常に実行された後でのみ、
注1:問題が
add.delay(1, 2).get()
mul.delay(3, 4).get()
を行うことによって解決することができますが、私は鎖が失敗したタスクで動作しない理由を理解することに興味があります。
私はチェーン以外のタスクを実行するチェーン状のタスクを使用することにしましたが、他のタスクを開始する前にタスクが終了するのを待ちます。たとえば、 'task1.delay([params])。取得する(); task2.delay([params])。get(); task3.delay([params]).get() 'を実行します。チェーン状のタスクは、いずれかのタスクによって発生した例外をキャッチして再試行できます。 – Andrei
あなたの例から、t1eとt2eはそれぞれt2とt3を呼び出す必要がありますか? – Andrei
チェーンの可能な構文に関する私の考えだけの例です。これは、次の各タスクが実際には一対のタスクであることを意味し、前のステップで例外/エラーが発生しなかった場合、ペアの最初の要素が呼び出され、2番目の要素が前の手順の失敗の例外/エラーハンドラです。 't1e'は' t1エラーハンドラ 'を意味します。 – anh