celeryとrabbitmqによるpython非同期処理、flowerによりブラウザでジョブ表示
環境 mac, Linux, miniconda
概要
スクリプトを並行して処理
celeryのインストール
conda install -c winand celery
RabbitMQのインストール
conda install -c conda-forge rabbitmq-server
conda install -y conda-forge::ncurses
- ncursesをインストールしないと以下のようなエラーが出る
dyld: Library not loaded: @rpath/libtinfo.6.dylib
Referenced from: /usr/local/Caskroom/miniconda/base/lib/erlang/erts-10.3/bin/beam.smp
Reason: image not found
flowerのインストール
conda install flower
チュートリアルの実行
https://youtu.be/68QWZU_gCDA
- 以下のタスクを定義するファイル作成(名前はtask.py)
from celery import Celery
app = Celery()
@app.task
def add(x, y):
return x + y
- redditmqサーバーの起動
ターミナルで
rabbitmq-server
- celeryの起動
ターミナルで -Aのあとはタスクを定義するファイル名。(task.pyを作ったのでtask)
celery worker -A task -l info
- ジョブを投げてみる
タスクを定義するファイルから関数をimportして投げる。 delayはceleryのappの関数。
from task import add
for i in range(10000):
add.delay(i, i)
celeryを実行したターミナルジジョブが実行されてる様子が観れる
flowerによりジョブをブラウザで見る
flower -A task --port=5555 --persistent=True
- localhost:5555 にアクセス
http://localhost:5555/
celeryによる並行処理の種類
https://youtu.be/Bo6UtRhedjE
- Chains - 逐次
celery.chains()
- group - 並行
celery.group()
- chords - 並行処理 -> 全て終わった後に別のコマンド(callback)実行
これが一番便利そう.
celery.chords()