celeryの使い方
概要
- celeryはサーバクライアントモデルのrpcとみなせる
- サーバサイド
- taskの命令を受け取って実行する
- クライアントサイド
- taskをサーバサイドに投げる
- サーバサイド
- 通信の仲介のソフトウェアにはredisなどを利用できる
- 実行にはceleryのタスクを実行するサーバサイドのプロセスと、そのタスクをリモートで呼び出すクライアントのプロセスが必要
インストール
$ python3 -m pip install celery
サーバサイドの実行
task.py
があるときceleryのプロセスを開始する$ celery -A tasks worker --loglevel=info
- ディレクトリ
bin
の中にある、bin/tasks.py
を実行$ celery -A bin.tasks worker --loglevel=info
- concurrency数の上限を設定
$ celery -A bin.task worker --concurrency=1 --loglevel=CRITICAL
- 注意点
- サーバサイドで関数の登録が失われたり、不整合が起きるときは redisを再起動
- クライアントのプロセスが立ち上がる前にかならずサーバサイドが立ち上がっていること
- サーバとクライアントのパッケージ粒度と名前空間が同じであること
サーバサイドのコードの例
- 仲介ソフトにはredisを利用
from celery import Celery
BROKER_URL = 'redis://localhost:6379/0'
BACKEND_URL = 'redis://localhost:6379/1'
app = Celery('tasks', broker=BROKER_URL, backend=BACKEND_URL)
@app.task
def add(x, y):
return x + y
クライアントサイドの実行
- 普通のpythonスクリプトとして実行する
- flaskなどからも実行可能である
- 注意点
- サーバのコードとクライアントのコードはパッケージ粒度と名前空間が同じであること
クライアントサイドのコードの例
from tasks import add
import time
result = add.delay(4, 4) # addの関数の呼び出し
time.sleep(0.1) # celeryのジョブの反映を少しだけ待つ
print(result.ready()) # True
print(result.status) # SUCCESS
print(result.get()) # 8