FlaskでCeleryを使った非同期タスク実行を完全ガイド|初心者でもわかるタスク管理入門
生徒
「Flaskでボタンを押したら、時間のかかる処理を裏で動かすことってできますか?」
先生
「できますよ。Flaskでは、Celery(セロリ)という仕組みを使うと、画面を止めずに処理を実行できます。」
生徒
「非同期処理って聞いたことはありますが、難しそうです……。」
先生
「大丈夫です。パソコンを触ったことがなくても理解できるように、たとえ話を使って説明します。」
1. Flaskと非同期処理とは何か?
Flask(フラスク)は、Python(パイソン)で作られたとてもシンプルなWebアプリケーションの仕組みです。 Webアプリとは、ブラウザで動くホームページのようなものだと考えてください。
通常のFlaskでは、ボタンを押すと処理が終わるまで画面が待ち状態になります。 これは、レストランで料理が出るまで席でじっと待っている状態に似ています。
一方、非同期処理とは、注文だけ先に受けて、料理は裏のキッチンで作り、 お客さんは先に席を離れてもよい、という考え方です。 この「裏のキッチン役」をしてくれるのがCeleryです。
2. Celeryとは?初心者向けにやさしく解説
Celery(セロリ)は、時間のかかる処理を別の場所で実行するための道具です。 専門用語では「タスク管理ツール」「非同期タスクキュー」と呼ばれます。
タスクとは「やることメモ」のようなものです。 Celeryは、そのメモを順番に処理してくれるアルバイトさんだと思ってください。
Flask本体には非同期処理の仕組みがほとんどありません。 そのため、Flask 拡張機能としてCeleryを組み合わせるのが一般的です。
3. FlaskとCeleryを一緒に使う全体の流れ
初心者の方は、まず全体像をつかむことが大切です。 FlaskとCeleryを使った非同期処理は、次のような流れになります。
- ① Flaskが画面からのリクエストを受け取る
- ② Celeryに「この作業をお願いします」と依頼する
- ③ Celeryが裏で処理を実行する
- ④ Flaskはすぐに画面を返す
これにより、ユーザーは待たされず、サーバーも効率よく動きます。
4. Flaskアプリの最小サンプル
まずは、いちばん基本となるFlaskアプリを見てみましょう。 ここでは「Hello」と表示するだけのシンプルな例です。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "Hello Flask!"
if __name__ == "__main__":
app.run()
このコードは、「/」という住所にアクセスしたときに文字を返すだけです。 まだCeleryは使っていません。
5. Celeryでタスクを定義する方法
次に、Celeryで「裏で動かす仕事」を作ります。 この仕事をタスクと呼びます。
from celery import Celery
import time
celery = Celery("tasks", broker="redis://localhost:6379/0")
@celery.task
def long_task():
time.sleep(5)
return "処理が終わりました"
ここでは5秒待つだけのタスクを作っています。
sleepは「少し待つ」という意味の命令です。
Redis(レディス)は、タスクの伝言板のような役割をする仕組みです。 細かい設定は気にせず、「仲介役」だと思ってください。
6. FlaskからCeleryタスクを呼び出す
次は、FlaskからCeleryのタスクをお願いする部分です。 ボタンを押したら、裏で処理が始まるイメージです。
from flask import Flask
from tasks import long_task
app = Flask(__name__)
@app.route("/start")
def start_task():
long_task.delay()
return "タスクを開始しました"
delay()は、「今すぐ裏で実行してね」という合図です。
これにより、画面はすぐに表示されます。
7. 非同期処理を使うメリットと注意点
FlaskでCeleryを使った非同期処理には、多くのメリットがあります。
- 画面が固まらない
- 重い処理を分けて実行できる
- サーバーの負担を減らせる
一方で、「処理が終わったかどうか」は別に確認する必要があります。 初心者のうちは、「裏で動いている」という理解だけで十分です。
8. よくある失敗と初心者向けの考え方
最初につまずきやすいのは、「なぜ画面に結果が出ないのか」という点です。 非同期処理では、すぐに結果を返さないのが普通です。
宅配便を送って、すぐに荷物が届かないのと同じです。 今は「発送しました」という情報だけを受け取ります。
FlaskとCeleryを使うときは、 「すぐ返す処理」と「時間がかかる処理」を分けて考えることが大切です。