呉高専 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って日本語記事ほとんどなくってつらい…
さて、明日はどんな記事が投稿されるのでしょうか!
お楽しみに!