web-dev-qa-db-ja.com

複数の独立したセロリキューを保持する方法?

同じredisデータベースに異なるタスクとワーカーを含む複数のセロリキューを保持しようとしています。私のマシンに2台ではなく1台のRedisサーバーだけが必要な便利な問題です。

セロリチュートリアルのドキュメントをそのまま使用しました。今、名前/キューを少し調整してすべてを複製しようとすると、エラーが発生し続けます。

注-私はPythonおよびCelery、これは明らかに問題の一部です。どの部分が名前として "task/tasks"と特別な単語として名前が付けられているかわかりません。

要約版のドキュメント:celery = Celery('tasks', broker='redis://localhost')と、遅延したい関数の上にある@task()を含むタスクコードが含まれています。

タスクをキューに入れるためのプログラム内で...

celery -A tasks worker

したがって、上記のすべてを考えると、これを別々のキューとワーカーで独立して実行される2種類のタスクに変えるために必要な手順は何ですか?たとえば、blue_tasksとred_tasks?

タスクのすべてのインスタンスをblue_tasksまたはred_tasksに変更しようとしました。ただし、blue_tasksをキューに入れると、起動したred_tasksワーカーが作業を開始します。

デフォルトのキューなどについて読んだので、このコードを試しましたが、うまくいきませんでした:

from tasks import do_work
do_work.delay()

サイドノートとして、CELERY_DEFAULT_QUEUE = 'red' CELERY_QUEUES = ( Queue('red', Exchange('red'), routing_key='red'), ) はデフォルトのamqpインスタンスに接続しようとするセロリでcelery workerエラーが発生する理由を理解できませんが、celery -A tasks workerはセロリにRedisへの接続を指示します。何も指定されていない場合、ワーカーで実行しようとするcelery workerタスクコードは何ですか?

31
jwoww

デフォルトでは、すべてがceleryという名前のデフォルトのキューに入ります(キューが指定されていない場合、これはcelery workerが処理します)

do_workDjango_project_root/myapp/tasks.pyタスク関数があるとしましょう。

do_workタスクは、次のように独自のキューで実行するように構成できます。

CELERY_ROUTES = {
    'myproject.tasks.do_work': {'queue': 'red'},
}

次に、celery worker -Q redを使用してワーカーを実行すると、そのキュー内のものだけが処理されます(celery workerで呼び出された別のワーカーは、デフォルトのキュー内のもののみをピックアップします)

ドキュメントの task routing セクションですべてを説明する必要があります。

49
dbr

別のキューに動的にリンクするには、次の手順に従います。

1)「キュー」属性でキューの名前を指定します

celery.send_task('job1', args=[], kwargs={}, queue='queue_name_1')
celery.send_task('job1', args=[], kwargs={}, queue='queue_name_2')

(ここで、特定のジョブは2つのキューを使用します)

2)構成ファイルに次のエントリを追加します

CELERY_CREATE_MISSING_QUEUES = True

3)ワーカーの起動中に、-Qを使用して、ジョブを消費するキュー名を指定します

celery -A proj worker -l info -Q queue1 
celery -A proj worker -l info -Q queue2
15
josepainumkal