2012-01-06 10 views
6

私はちょうどDjangoプロジェクトでセロリをやっています。この特定の問題にちょっと悩まされています。基本的には、長時間実行されるタスクを別のワーカーに配布する必要があります。タスクは実際にはいくつかのステップに分割され、それぞれが完了するまでにかなりの時間がかかります。したがって、いくつかのステップが失敗した場合は、セラーリが同じ作業者を使用してこのタスクを再試行し、完了したステップの結果を再利用したいと思います。セロリはルーティングを使用して特定のサーバーにタスクを配布しているが、この特定の問題については何も見つかりません。私はブローカーとしてRabbitMQを使用しています。あなたはすべてのcelerydのインスタンスを持つことができ同じ労働者を使ってセロリを再試行する方法は?

答えて

11

は、労働者のホスト名にちなんで名付けられたキューから消費:

celeryd -l info -n worker1.example.com -Q celery,worker1.example.com 

worker1.example.comにホスト名を設定し、同じ名前のキューと同様に、デフォルトのキューから消費します(celeryと命名)。再試行を指示するsimilary

task.apply_async(args, kwargs, queue="worker1.example.com") 

task.retry(queue="worker1.example.com") 

または同じ労働者への再試行を指示する:

次にあなたが使用することができ、特定の作業者に作業を指示する

task.retry(queue=task.request.hostname) 
+0

お返事ありがとうございました!私はこれがまさに私が探しているものだと思います。私はretry()にキュー名を渡すことができないことを認識していませんでしたが、今はかなり意味があります:) – dangmai

+0

'celeryd'は廃止予定です。' celery worker'を使用してください。 – user

+0

Windowsでは '%computername%'を、Linuxでは '\' hostname \ ''を使用してコマンドラインを構築します。 – ubershmekel

関連する問題