flaskでasyncのやり方
概要
- taskが完了する前にリターンコードを返す
- 実装方法は様々にあるが、/celery/を用いてRPCのtaskにする
flaskによるasyncに対応した最小限のサーバの実装例
celeryのタスク
bin/task.py
のようなファイルにするcelery -A bin.task worker --concurrency=1 --loglevel=CRITICAL
を実行する
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 job(arg):
... # なにか重い処理
return True
flaskのコードからceleryのタスクを呼ぶ
- celeryのタスクを定義したファイルをimportする
- celeryのIFで対象の関数を呼び出すと、非同期としてあつかえる
from flask import Flask, request
from .task import job
# 取得
@app.route('/', methods=["GET"])
def home():
obj = request.get_json()
result = job.delay(obj) # ここで非同期にジョブが実行可能
return f"async_job started. id = {result.id}", 200
if __name__ == '__main__':
app.run(debug=True)