Flaskで長時間処理をAPIレスポンスと分離するベストプラクティス|初心者向け非同期処理とタスク管理
生徒
「FlaskでAPIを作ったら、処理が長すぎて画面がずっと待ち状態になるんですが、これって普通ですか?」
先生
「よくある状況ですね。長時間処理をそのままAPIレスポンスに入れると、ユーザーは待たされてしまいます。」
生徒
「じゃあ、どうやって作るのが正解なんですか? プログラミングも初めてで……。」
先生
「Flaskでは、APIの返事と長い作業を分けるのが基本です。たとえ話を使いながら順番に説明します。」
1. Flaskで長時間処理をそのまま書くと何が起きるか
Flask(フラスク)は、Pythonで作られたシンプルなWebアプリケーションの仕組みです。 APIとは、画面や他のプログラムからの「お願い」を受け取って、「返事」を返す窓口だと考えてください。
APIの中で、時間のかかる処理をそのまま実行すると、返事が返るまで待つことになります。 これは、レジで会計をしている途中に、店員さんが裏で掃除を始めるようなものです。
結果として、画面が固まったり、エラーが出たりします。 Flask 長時間処理、API 遅い、レスポンス 待ちという悩みは、ここから生まれます。
2. APIレスポンスと処理を分離する考え方
ここで大切なのが、「APIの返事はすぐ返す」という考え方です。 APIは「受付完了しました」と伝えるだけで十分な場合が多いです。
長時間処理は、APIの外側、つまり裏で進めます。 レストランで注文だけ先に受けて、料理は厨房で作るイメージです。
このように、レスポンスと処理を分ける設計が、 Flask 非同期処理、タスク管理の基本的な考え方になります。
3. 長時間処理の例を見てみよう
まずは、よくある「よくない例」を見てみましょう。 ここでは、5秒待つ処理をAPIの中に直接書いています。
from flask import Flask
import time
app = Flask(__name__)
@app.route("/heavy")
def heavy_process():
time.sleep(5)
return "処理が終わりました"
このAPIにアクセスすると、5秒間なにも返ってきません。 初心者の方は「止まった」と感じてしまいます。
4. 処理を分離してAPIはすぐ返す
次に、APIでは「開始したよ」という返事だけを返す形にします。 処理そのものは別の関数に分けます。
def long_task():
import time
time.sleep(5)
print("裏で処理が完了しました")
@app.route("/start")
def start():
long_task()
return "処理を開始しました"
考え方としては正しくなりましたが、 まだ「裏で処理」にはなっていません。 このままだと、APIはやはり待ってしまいます。
5. 非同期処理で完全に分離する
本当に分離するには、非同期処理という仕組みを使います。 非同期とは、「同時に別のことをする」という意味です。
Flaskでは、Celeryやバックグラウンドタスクを使って、 長時間処理を別担当に任せます。
from celery import Celery
import time
celery = Celery("tasks", broker="redis://localhost:6379/0")
@celery.task
def long_task():
time.sleep(5)
return "完了"
このタスクは、Flaskとは別の場所で実行されます。
6. APIはタスク開始だけを行う
FlaskのAPIでは、タスクを「お願いする」だけにします。 これがベストプラクティスです。
@app.route("/start_async")
def start_async():
long_task.delay()
return "受付しました"
これで、APIは一瞬で返事を返します。 処理は裏で静かに進みます。
Flask API 非同期、長時間処理 分離という検索で、 多くの人がこの形を求めています。
7. 分離設計の全体イメージ
ここで、全体の流れを整理します。
- ① クライアントがAPIを呼ぶ
- ② Flaskが「受付完了」を返す
- ③ 非同期タスクが裏で処理
- ④ 必要なら後から結果を確認
APIは受付係、 非同期タスクは作業係です。 役割を分けることで、サービスが安定します。
8. 初心者が覚えておきたい設計のポイント
初心者の方は、 「APIは結果を返さなければいけない」と思いがちです。 しかし、実際は「開始した」という情報だけで十分な場面が多いです。
長時間処理をAPIから切り離すことで、 画面が固まらず、エラーも減ります。
Flask 長時間処理、API 設計、非同期処理 ベストプラクティス という考え方は、最初に身につけておくと安心です。