celeryとrabbitmqによるpython非同期処理、flowerによりブラウザでジョブ表示

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()