2016-04-19 13 views
1

は私がのがBそれらを呼びましょう、同じDjangoプロジェクトの2つのコピーを実行するマシンを持っている、と私は背景を処理するためにセロリを使用したいですタスク。セロリ、特定のキューにルーティングDjangoプロジェクト内のすべてのタスクを

スーパーバイザをセットアップして、プロジェクトごとに2人のワーカーを立ち上げましたが、タスクが両方のプロジェクトで同じ名前になっていると、間違った作業者によってタスクが実行されることがあります。

次のステップでは、-Q queueNameパラメータを使用して、別のキューを各ワーカーに使用しました。 rabbitmqctl list_queuesを使用すると、両方のキューが作成されていることがわかりました。私は労働者を発行するために使用しているコマンドは

python3 -m celery worker -A project -l INFO -Q q1 [email protected] 

python3 -m celery worker -A project -l INFO -Q q2 [email protected] 

の質問は、どのように私のルートプロジェクトにキューからすべてのタスク、およびすべてですプロジェクトからのタスクキューB?はい、キューを選択するためにtaskデコレータにパラメータを追加できますが、グローバル設定などを探しています。

編集1:私はCELERY_DEFAULT_QUEUEを試してみましたが、動作しません。設定は無視されます。私はまた、このように、ダムルーターを作成しようとしました:

class MyRouter(object): 
    def route_for_task(self, task, args=None, kwargs=None): 
     return 'q1' 

CELERY_ROUTES = (MyRouter(),) 

そして、それは(明らかに、各プロジェクト内の異なるキューを返す)動作しますが、私は、なぜCELERY_DEFAULT_QUEUE設定は無視されて困惑していますか?

答えて

1

を助け願っています。私はちょうど既定のキューと既定のルーティングキーの両方を設定しなければなりませんでした(そしてデフォルトでは、交換はdirectの交換である限り)。

CELERY_DEFAULT_QUEUE = 'q2' 
CELERY_DEFAULT_EXCHANGE = 'q2' 
CELERY_DEFAULT_ROUTING_KEY = 'q2' 

私はいくつかの概念が不明確だったが、official RabbitMQ's tutorialsに従った後、彼らはより明確になったと私は問題を解決することができました。

0

私はあなたが私のexmapleでsettings.py

CELERY_ROUTES = { 

    'services.qosservice.set_qos_for_vm': {'queue': 'qos_celery'}, 

    'services.qosservice.qos_recovery': {'queue': 'qos_celery'}, 

    'services.qosservice.qos_recovery_compute': {'queue': 'qos_celery_1'}, 

} 

にrouing定義しなければならないと思います。タスクset_qos_for_vmはqos_celeryキューにルーティングされ、タスクqos_recovery_computeキューはqos_celery_1にルーティングされます。

もっと詳しく:

http://docs.celeryproject.org/en/latest/userguide/routing.html#id2はそれは私が予想よりも簡単だった最後にはあなたに

+0

すべてのタスクをリストする必要はありますか?ワイルドカードのようなものはありませんか? –

+0

いいえ、私は知らない。 –

関連する問題