Flask×Celeryで定期実行処理(スケジューラー)を導入する方法を完全解説|初心者向け非同期タスク管理
生徒
「Flaskで、毎日決まった時間に自動で処理を動かすことってできますか?」
先生
「できますよ。FlaskとCeleryを組み合わせると、定期実行処理、つまりスケジューラーを作れます。」
生徒
「スケジューラーって、目覚まし時計みたいなものですか?」
先生
「まさにその通りです。時間になったら自動で処理を動かす仕組みを、これから順番に説明します。」
1. Flaskで定期実行処理が必要になる場面
Flask(フラスク)は、Pythonで作られた軽量なWebアプリケーションの仕組みです。 普段は、ボタンを押したときなど「人の操作」をきっかけに動きます。
しかし、実際のWebサービスでは、人が操作しなくても動いてほしい処理があります。 たとえば、毎朝のデータ整理、定期的なメール通知、古い情報の削除などです。
これらは「決まった時間に毎回やる作業」です。 人が毎回実行するのは大変なので、コンピューターに任せます。 この仕組みが定期実行処理です。
2. 非同期処理とスケジューラーの基本
非同期処理とは、時間のかかる作業を裏で進める方法です。 Flaskが画面表示を担当し、重い処理は別の担当が行います。
スケジューラーは、「何時に、何をするか」を決める時計係です。 学校のチャイムのように、時間になると決まった行動を促します。
FlaskとCeleryを組み合わせると、 「時間になったら、裏でタスクを実行する」という流れが作れます。 これがFlask 定期実行、Celery スケジューラーと呼ばれる仕組みです。
3. CeleryとCelery Beatの役割
Celery(セロリ)は、非同期タスクを実行する専門スタッフです。 一方、Celery Beatは、時間を管理するスケジュール帳のような存在です。
Celery Beatが「今です」と合図を出し、 Celeryが実際の作業を行います。
Flaskは最初に設定するだけで、 定期実行そのものには関わりません。 この分業が、安定したタスク管理につながります。
4. 定期実行するタスクを作る
まずは、定期的に実行したい処理をタスクとして定義します。 ここでは「決まった時間にメッセージを表示する」簡単な例です。
from celery import Celery
celery = Celery(
"tasks",
broker="redis://localhost:6379/0"
)
@celery.task
def daily_task():
print("定期実行タスクが動きました")
このコードは、「やることメモ」を1つ作っただけです。 まだ自動では動きません。
5. Celery Beatでスケジュールを設定する
次に、Celery Beatを使って「いつ実行するか」を決めます。 ここでは、1分ごとに実行する設定にします。
from celery.schedules import crontab
celery.conf.beat_schedule = {
"run-every-minute": {
"task": "tasks.daily_task",
"schedule": crontab(minute="*"),
},
}
crontabは、時間割を作るための書き方です。
難しく見えますが、「毎分」「毎日」などを指定できる表現方法だと思ってください。
6. Flaskと定期実行処理の関係
Flaskは、定期実行の「管理係」ではありません。 あくまで、Web画面を表示する役割です。
そのため、定期実行処理はFlaskの外側で動きます。 Flaskが止まっていても、CeleryとCelery Beatが動いていれば、 タスクは予定通り実行されます。
これが、Flask 非同期処理、タスク管理、スケジューラー構成の基本です。
7. 定期実行処理の動作イメージ
ここで、全体の流れを整理しましょう。
- ① Celery Beatが時間をチェック
- ② 時間になるとタスク実行を指示
- ③ Celeryがタスクを実行
- ④ Flaskは画面表示に専念
この仕組みは、目覚まし時計と作業係が分かれている状態です。
8. 初心者がつまずきやすいポイント
初心者がよく混乱するのは、「Flaskを起動したのに動かない」という点です。 定期実行処理は、Flaskとは別にCeleryとCelery Beatを起動する必要があります。
また、結果がすぐ画面に出ないのも普通です。 定期実行は「見えないところで動く」のが特徴です。
Flask×Celeryで定期実行を使うときは、 「画面用」と「裏作業用」を分けて考えることが大切です。