web-dev-qa-db-ja.com

CeleryとDjango)を使用してタスクを異なるキューにルーティングする方法

私は次のスタックを使用しています:

  • Python 3.6
  • Celery v4.2.1(ブローカー:RabbitMQ v3.6.0
  • Django v2.0.4

Celeryのドキュメント によると、異なるキューでスケジュールされたタスクを実行するのは、CELERY_ROUTESのタスクに対応するキューを定義するのと同じくらい簡単です。それにもかかわらず、すべてのタスクはCeleryのデフォルトキューで実行されているようです。

これはmy_app/settings.pyの構成です:

CELERY_BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_ROUTES = {
 'app1.tasks.*': {'queue': 'queue1'},
 'app2.tasks.*': {'queue': 'queue2'},
}
CELERY_BEAT_SCHEDULE = {
    'app1_test': {
        'task': 'app1.tasks.app1_test',
        'schedule': 15,
    },
    'app2_test': {
        'task': 'app2.tasks.app2_test',
        'schedule': 15,
    },

}

タスクは、ルーティングをテストするための単純なスクリプトです。

ファイルapp1/tasks.py

from my_app.celery import app
import time


@app.task()
def app1_test():
    print('I am app1_test task!')
    time.sleep(10)

ファイルapp2/tasks.py

from my_app.celery import app
import time


@app.task()
def app2_test():
    print('I am app2_test task!')
    time.sleep(10)

必要なすべてのキューを使用してCeleryを実行すると、次のようになります。

celery -A my_app worker -B -l info -Q celery,queue1,queue2

RabbitMQは、デフォルトのキュー「celery」のみがタスクを実行していることを示します。

Sudo rabbitmqctl list_queues
# Tasks executed by each queue:
#  - celery 2
#  - queue1 0
#  - queue2 0

誰かがこの予期しない動作を修正する方法を知っていますか?

よろしく、

6
Ander

私はそれを機能させました、ここで注意することがいくつかあります:

Celeryの4.2.0ドキュメント によると、CELERY_ROUTESはキュールーティングを定義する変数である必要がありますが、代わりにCELERY_TASK_ROUTES。タスクルーティングはCeleryBeatから独立しているように見えるため、これは手動でスケジュールされたタスクに対してのみ機能します。

app1_test.delay()
app2_test.delay()

または

app1_test.apply_async()
app2_test.apply_async()

Celery Beatで機能させるには、キューを明示的に定義する必要があります。ファイルの最終設定my_app/settings.pyは次のようになります。

CELERY_BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_TASK_ROUTES = {
 'app1.tasks.*': {'queue': 'queue1'},
 'app2.tasks.*': {'queue': 'queue2'},
}
CELERY_BEAT_SCHEDULE = {
    'app1_test': {
        'task': 'app1.tasks.app1_test',
        'schedule': 15,
        'options': {'queue': 'queue1'}
    },
    'app2_test': {
        'task': 'app2.tasks.app2_test',
        'schedule': 15,
        'options': {'queue': 'queue2'}
    },

}

これにより、他の開発者の時間を節約できることを願っています。

8
Ander

デコレータにqueueパラメータを追加すると、役立つ場合があります。

@app.task(queue='queue1')
def app1_test():
    print('I am app1_test task!')
    time.sleep(10)
7
JPG