FlaskのAPIを高速化する方法!キャッシュと並列処理の基本を初心者向けにやさしく解説
生徒
「先生、FlaskでAPIを作ったんですけど、アクセスが増えると遅くなってしまいます…。」
先生
「それは“パフォーマンスチューニング”が必要ですね。キャッシュと並列処理という仕組みを取り入れると、FlaskのAPIが速くなりますよ。」
生徒
「キャッシュとか並列って、パソコン初心者にはちょっと難しそうですけど…大丈夫でしょうか?」
先生
「もちろんです!できるだけやさしい例えと図で解説しますね。一緒にゆっくり理解していきましょう!」
1. Flaskとは?まずはおさらい
Flask(フラスク)は、Pythonで作られた軽量なWebアプリの仕組みです。簡単にAPI(アプリ同士のやり取りの入口)を作れるので、初心者にも人気です。
たとえば、スマホアプリが画像やデータをFlaskに送って、Flaskが答える、という仕組みを作れます。
2. パフォーマンスチューニングとは?
パフォーマンスチューニングとは、「処理を速くする工夫」のことです。たくさんの人が同時にアクセスしても、サクサク動くようにするための調整です。
たとえば、レストランで1人のシェフが全部の料理を作るより、数人で分担して同時に調理すれば、早く提供できますよね。それと同じです。
3. キャッシュってなに?
キャッシュとは、「一度計算した結果を覚えておいて、次に同じ質問が来たら早く答える仕組み」です。
たとえば、「今日の天気」を5分ごとに答えるAPIなら、同じ質問に毎回同じ答えを出すので、何度も計算するのはムダです。
そんなとき、前回の答えを覚えておくと、すぐ返せるので速くなります。
4. Flaskでキャッシュを使う
Flaskでキャッシュ機能を使うには、functools.lru_cacheというPython標準の仕組みが便利です。
以下は、数字を2倍にするAPIにキャッシュをつける例です。
from flask import Flask, request, jsonify
from functools import lru_cache
app = Flask(__name__)
@lru_cache(maxsize=100) # 最大100件まで記憶
def slow_calculation(x):
import time
time.sleep(2) # 時間がかかる処理(2秒)
return x * 2
@app.route('/double')
def double():
num = int(request.args.get('num', 0))
result = slow_calculation(num)
return jsonify({'result': result})
if __name__ == '__main__':
app.run(debug=True)
このAPIは最初は2秒かかりますが、2回目以降はキャッシュにより一瞬で返ります。
5. 並列処理ってなに?
並列処理(へいれつしょり)とは、「同時に複数のことをやる方法」です。
料理をするときに、ご飯を炊きながらスープを温めると時間が節約できますよね? それが並列処理です。
Flaskでは、たくさんの人が同時にアクセスしても、処理が順番待ちにならないようにするのがポイントです。
6. Flaskで並列処理するには?
Flask自体は1つずつしかリクエストを処理できないことがあります。なので、threaded=Trueや、gunicornという外部ツールを使って、複数同時に処理する仕組みを入れます。
# Flaskをマルチスレッドで起動する例
if __name__ == '__main__':
app.run(debug=True, threaded=True)
また、本番環境ではgunicorn(グニコーン)という専用の実行ツールを使うのが一般的です。
gunicorn -w 4 -b 0.0.0.0:5000 app:app
このコマンドでは、-w 4で「4つ同時に処理できる」ようにします。
7. キャッシュと並列処理の注意点
キャッシュの注意点:
- データが古くなると、正しくない情報を返すことがあります。
- 保存できる件数に上限があるため、使いすぎるとメモリがいっぱいになります。
並列処理の注意点:
- 同じデータを同時に書き換えると、データが壊れることがあります。
- 外部ツールを使うには少し設定が必要です。
8. FlaskのAPIを速くする現実的なステップ
まずは@lru_cacheでキャッシュをつけて、APIの反応を速くしましょう。
次に、threaded=Trueで同時処理できるようにしてみてください。もし本格的に速さを求めるならgunicornのようなツールも試しましょう。
どちらもプログラミング初心者でも、少しずつ実験して覚えていける内容です。
まとめ
FlaskでAPIを構築するときに欠かせない高速化の基本として、きゃっしゅ機能と並列処理の仕組みはとても大切であり、初心者でも取り組みやすい効果的な最適化方法です。とくに、同じ計算結果を何度も返す類のAPIでは、きゃっしゅが大きな力を発揮し、複雑な処理や時間のかかる演算を毎回最初から行う必要がなくなります。きゃっしゅを導入すると、結果を記憶してすぐに返せるため、利用者が増えても安定した応答速度を保つことができ、さらにサーバー側の負荷も軽減できます。Python標準のlru_cacheは簡単に導入でき、初学者にも扱いやすいのが魅力です。Flaskの基本構造にそのまま組み込める点も安心で、初めて高速化に挑戦する人にとって非常に役立つ選択肢になります。 また、複数の処理を同時に動かす並列処理は、多くのアクセスが同時に来る場面で活躍します。ひとつずつ順番に処理していると待ち時間が増えてしまいますが、並列で実行すれば待ち時間を減らし、利用者によりすばやいレスポンスを届けられます。たとえばthreadedを有効にしてマルチすれっどで処理したり、より本格的な運用環境ではgunicornのような外部ツールを使って複数のworkerを立ち上げることもできます。このような設定を取り入れることで、Flaskで作ったAPIはぐっと実用的になり、アクセスが集中しても安定した動作を保つことができます。 さらに、きゃっしゅや並列処理を利用する際には注意点もおさえておく必要があります。きゃっしゅは古い情報を返す可能性があるため更新間隔や保存数には気を付けなければなりません。並列処理は同時書き込みによるデータ不整合が発生するケースもあるので、工夫が欠かせません。とはいえ、これらの注意点を理解しながら、実際の開発に少しずつ取り入れていくことで、初心者でも安心して高速化の基礎を身につけることができます。 ここでは、これまでに学んだ高速化の流れをふりかえりながら、実際に使えるサンプルの形も確認しておきましょう。以下のコードでは、FlaskのAPIにきゃっしゅと並列処理の要素を組み合わせ、実際の開発でも応用しやすい形にまとめています。こうした実装を手元で試しながら、少しずつ理解を深めていくことで、API高速化の基本がより確かな知識として定着します。
サンプルコード
from flask import Flask, jsonify
from functools import lru_cache
import time
app = Flask(__name__)
@lru_cache(maxsize=200)
def heavy_work(x):
time.sleep(1)
return x * 3
@app.route('/triple')
def triple():
result = heavy_work(10)
return jsonify({"value": result})
if __name__ == "__main__":
app.run(threaded=True)
生徒
「きょうの学習で、FlaskのAPIはただ作るだけじゃなくて、速く動かす工夫も大切だとわかりました。きゃっしゅがあると、同じ計算を何度もやらなくてもよくなって、とても便利ですね。」
先生
「そのとおりです。特に、重たい処理を何回も実行するAPIはきゃっしゅとの相性がばつぐんです。結果を覚えておくことで時間を大幅に短縮できます。」
生徒
「それから、並列処理の仕組みで、一度に複数のリクエストをさばけるというのもすごく役に立ちそうです。threadedを使うだけでもずいぶん変わりますね。」
先生
「ええ、並列処理を取り入れると、アクセスが増えても待ち時間が少なくなるので、実際のサービスでもとても効果があります。慣れてきたら外部ツールも組み合わせて、より安定した環境を構築していきましょう。」
生徒
「はい!きゃっしゅと並列処理の仕組みを組み合わせることで、FlaskのAPIがどんどん実用的になることが実感できました。これからもいろいろ試してみます!」