Edited at

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

呉高専 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って日本語記事ほとんどなくってつらい…

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

お楽しみに!