LoginSignup
3
1

More than 5 years have passed since last update.

Celery4.2.1でタスクにデフォルトのQueueを指定する

Last updated at Posted at 2018-11-30

呉高専 Advent Calendar 2018 1日目の記事です。

今年もこの季節がやってきましたね。なんだか今年は例年より暖かい気がしています。
さて、呉高専の専攻科生のちゃんゆーです。1日目は軽めなお話です。

PythonでジョブキューといえばCeleryが挙げられますが、CeleryのQueue指定方法について書いていきます。

目次

  • 前提
  • タスク実行時にQueueを指定する方法
  • タスクにデフォルトのQueueを指定する方法
  • Djangoの場合
  • まとめ

前提

環境は

$ pip freeze
celery==4.2.1

を想定しています。

公式ドキュメントより、下記タスクを定義しているとします。

from celery import Celery

app = Celery('tasks', broker='pyamqp://guest@localhost//')

@app.task
def add(x, y):
    return x + y

First Steps with Celery — Celery 4.2.0 documentation

なお、以下のQueue、Workerを起動しているものとします。

$ celery -A proj worker -Q high
$ celery -A proj worker -Q middle
$ celery -A proj worker -Q low

タスク実行時にQueueを指定する方法

こちらはよく見かける指定方法。

add.apply_async(queue='high')

addタスクが、highのQueueで実行されます。

タスクにデフォルトのQueueを指定する方法

タスクによっては、実行するQueueを固定したい場合もあるでしょう。
その場合は、デコレータに指定してやります。

@app.task(queue="high")
def add(x, y):
    return x + y

add.apply_async()
add.delay() # もちろんdelayでもOK!

このことを知らず、呼び出し側から毎度指定していたのですが、その必要もなかったのですね…

この辺よく調べるとドキュメントにもちゃんと書いてありました。
celery.app.task — Celery 4.2.0 documentation
ちゃんと読み込む必要ありますね…

Djangoの場合

DjangoでCeleryを使う場合、以下のように shared_task デコレータを使うことが多いと思います。

from celery import shared_task

@shared_task
def add(x, y):
    return x + y

この場合、 @app.task と同様にQueueの指定ができます。

@shared_task(queue="high")
def add(x, y):
    return x + y

add.delay()

まとめ

今回はCeleryのデフォルトのQueueの設定方法をまとめました。
ちなみに、デフォルトのQueueを指定しても、呼び出し時に指定すると、呼び出し時に指定したQueueが優先されるようです。

それにしても、Celeryって日本語記事ほとんどなくってつらい…

さて、明日はどんな記事が投稿されるのでしょうか!
お楽しみに!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1