• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

celery

date: 2022-05-13 excerpt: celeryの使い方

tag: pythoncelerytask queueasync


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


pythoncelerytask queueasync Share Tweet