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_unlock
がcallback
呼び出されることはありません。
私の問題は、タスクheader
が完了したことを検出できないことにあると推測し、ドキュメントを参照して、これをカスタマイズする方法を調べました。同期の実装方法を説明するセクションを見つけました。例が提供されています。不足しているのは、そのサンプル関数を呼び出す方法です (つまり、これに対する信号はありますか?)。
さらに、このメソッドは Redis バックエンドでは使用されないことに注意してください。
これは、ヘッダー内の各タスクの後にカウンターをインクリメントし、カウンターがセット内のタスク数を超えたときにコールバックを適用する、Redis と Memcached を除くすべての結果バックエンドで使用されます。
しかし、Redis のアプローチの方が優れているとも言います。
Redis と Memcached のアプローチは、はるかに優れたソリューションです
それはどのようなアプローチですか?それはどのように実装されていますか?
では、なぜchord_unlock
完了しないのでしょうか? また、完了したheader
タスクを検出するにはどうすればよいでしょうか?
私が使用している: Django 1.4、セロリ 2.5.3、django-セロリ 2.5.5、redis 2.4.12