9

Redis で Django Celery を使用して、次のようないくつかのタスクを実行しています。

header = [
    tasks.invalidate_user.subtask(args = (user)),
    tasks.invalidate_details.subtask(args = (user))
]

callback = tasks.rebuild.subtask()

chord(header)(callback)   

したがって、基本的にドキュメントに記載されているものと同じです。

私の問題は、このタスクコードが呼び出されると、celery.chord_unlockタスクが永遠に再試行し続けることです。のタスクはheader正常に終了しましたが、完了していないため、chord_unlockcallback呼び出されることはありません

私の問題は、タスクheaderが完了したことを検出できないことにあると推測し、ドキュメントを参照して、これをカスタマイズする方法を調べました。同期の実装方法を説明するセクションを見つけました。例が提供されています。不足しているのは、そのサンプル関数を呼び出す方法です (つまり、これに対する信号はありますか?)。

さらに、このメソッドは Redis バックエンドでは使用されないことに注意してください。

これは、ヘッダー内の各タスクの後にカウンターをインクリメントし、カウンターがセット内のタスク数を超えたときにコールバックを適用する、Redis と Memcached を除くすべての結果バックエンドで使用されます。

しかし、Redis のアプローチの方が優れているとも言います。

Redis と Memcached のアプローチは、はるかに優れたソリューションです

それはどのようなアプローチですか?それはどのように実装されていますか?

では、なぜchord_unlock完了しないのでしょうか? また、完了したheaderタスクを検出するにはどうすればよいでしょうか?

私が使用している: Django 1.4、セロリ 2.5.3、django-セロリ 2.5.5、redis 2.4.12

4

3 に答える 3

8

タスクの例はありませんが、同じ問題があり、私の解決策が適用される可能性があります。

ignore_result=Trueコードに追加するタスクは、次のように定義されていました。

@task(ignore_result=True)

どうやら結果を無視すると、chord_unlock タスクがそれらが完了したことを認識しないようになります。ignore_result を削除した後 (タスクが true のみを返す場合でも)、コードはコールバックを適切に呼び出しました。

于 2012-07-18T20:48:19.743 に答える
0

同じエラーが発生しました。ブローカーをrabbitmqに変更し、タスクが終了するまでchord_unlockが機能しています(2〜3分のタスク)。

redisを使用すると、タスクが終了し、chord_unlockは1秒ごとに8〜10回しか再試行されなかったため、コールバックは正しく実行されませんでした。

[2012-08-24 16:31:05,804: INFO/MainProcess] Task celery.chord_unlock[5a46e8ac-de40-484f-8dc1-7cf01693df7a] retry: Retry in 1s [2012-08-24 16:31:06,817: INFO/MainProcess] Got task from broker: celery.chord_unlock[5a46e8ac-de40-484f-8dc1-7cf01693df7a] eta:[2012-08-24 16:31:07.815719-05:00]

... just like 8-10 times....

ブローカーの変更は私のために働きました、今私は@Chrisソリューションをテストしています、そして私のコールバック関数はヘッダーサブタスク:Sから結果を決して受け取らないので、それは私のために働きません。


セロリ==3.0.6

django == 1.4

django-celery == 3.0.6

redis == 2.6

ブローカー:redis-MacOSXでは2.4.16

于 2012-08-24T21:32:03.883 に答える