2011-10-20 5 views
4

タスクの名前に基づいてタスクをルーティングするセロリを取得しようとしています...基本的に、私は 'worker.some_name'と 'web.some_name' '、私はworkerとwebと呼ばれる2つの異なるキューをそれぞれ使用します。私は、すべてのワーカー・タスクをワーカー・キューに入れたいと思います。現在、私はこのような大きなCELERY_ROUTES辞書があります。CELERY_ROUTES - タスク名に基づいてルーティングする方法

CELERY_ROUTES = { 
    "web.some_name": { 
     "queue": "web" 
    }, 
    "web.some_other_name": { 
     "queue": "web" 
    }, 
    etc.... } 

をしかし、私はより一般的なような何か希望:

CELERY_ROUTES = (MyRouter(),) 
class MyRouter(object): 
    def route_for_task(self, task, args=None, kwargs=None): 
     if task.split('.')[0] == "worker": 
      return {"queue": "worker"} 
     return {"queue": "web"} 

をしかし、これは動作するようには思えません。何か案は?ありがとう。

答えて

2

交換タイプを直接からトピックに変更することで、必要な操作を行うことができます。この方法は、あなたは、ウェブなどのタスクを指定することができます*または労働者*

あなたはここでそれをよく読んですることができます。あなたがきたタスクのために「app.task @」デコレータを使用している必要があります

+1

:http://celery.readthedocs.org/ en/latest/userguide/routing.html#amqp-primer – Tendrid

+0

メッセージブローカーとしてredisで動作しますか? http://celery.readthedocs.org/en/latest/userguide/routing.html#manual-routingでワイルドカードを使用した手動ルーティングの例を使用することができません。 – odedfos

3

http://ask.github.com/celery/userguide/routing.html#topic-exchanges pyファイルで定義されています。

あなたはできるリンクはダンが言及したすべての情報との良好なソースHERESに、死んでいるのルートあなたのタスクをapp.task(キュー=「queue_nameの」)@使って

+0

これは私の一日を保存しました。このデコレータを使用している場合、ルーティングは機能しませんか? – Greg0ry

+0

これは、セロリが "セロリ"という名前で作成したデフォルトのキューに移動する可能性があります。それを避けてください。 –

関連する問題