
PythonのWSGIとASGIはケーキを焼くようなもの?
この記事の更新者 ダイアナ・ファム2025年4月
はじめに
WSGIとASGIの違いに戸惑ったことがあるのは、あなただけではありません!ケーキを焼くという簡単な(そしておいしい)例えを使って説明しましょう。
WSGIとASGIとは?
WSGI (Web Server Gateway Interface) と ASGI (Asynchronous Server Gateway Interface) は Python Web サーバーが Web アプリケーションとどのように通信するかを定義します。WSGIとASGIはWebサーバーとPythonフレームワークの間に位置し、送られてくるリクエストを処理します。しかし、これらは基本的に異なる方法でリクエストを扱います。
WSGI v. ASG Iinterface
WSGI:伝統的な同期アプローチ
WSGIはリクエストを 同期的につまり、各リクエストは一度に一つずつ、順番に処理されます。次のリクエストは、処理される前に前のリクエストが終了するのを待たなければなりません。
もしあなたが フラスコを使ったことがあるなら、WSGIに遭遇したことがあるでしょう。しかし、このシーケンシャルな処理は、特に多くのリクエストを同時に処理する場合、遅くなることがあります。
ASGI:最新の非同期アプローチ
WSGIの後継であるASGIは、以下を導入している。 非同期リクエスト処理を導入している。これは、複数のリクエストを互いに待つことなく同時に処理できることを意味します。
新しいPythonウェブフレームワークをご存知だろうか、 FastAPI.デフォルトではASGIを使用しており、非常に高速です。FastAPIは、Pythonのasyncとawaitキーワードを使った非同期コードをすぐにサポートするなど、多くの利点を持つマイクロWebフレームワークでもあります!
WSGIとASGIの比較:ケーキ作りの類似性
WSGIとASGIの違いを理解するために、誕生日パーティーのお菓子を準備しているところを想像してみてください。これらは2つの別々のタスク、つまりWeb用語では2つの入ってくる リクエスト.
WSGI:一度に1つのタスク(同期処理)
WSGIでは、各リクエストは 次から次へと.あなたは 次のタスクに移る前にを完了させなければなりません。
Request 1: Bake Cake
1. Mix the batter
2. Pour it into pans
3. Bake in the oven (30 min wait)
Request 2: Make Frosting
4. Mix butter and powdered sugar
5. Add vanilla and milk
6. Stir until smoothだから、焼くのに30分かかるとしたら、焼き始める前に待たされることになる。 始める前に待つことになる。これは同期処理であり、ただ待っているだけであっても、タスクが重なることはない。
Synchronous requests
ASGI:リクエスト間のマルチタスク(非同期処理)
ASGIでは 一度に複数のリクエストを処理できる.オーブン内のケーキのように)1つが待たされている場合は、切り替えて別の作業をすることができます。
Request 1: Bake Cake
1. Mix the batter
2. Pour it into pans
3. Put it in the oven (starts baking)
→ Switch to Request 2 while the cake bakes…
Request 2: Make Frosting
4. Mix butter and powdered sugar
5. Add vanilla and milk
6. Stir until smooth
→ Return to Request 1 once the cake is doneアイドルになる代わりに、時間を有効活用できる。ASGIは、タスクの一時停止と再開を可能にすることで、他のすべてをブロックすることなく、I/Oやその他の長いオペレーションを処理します。
⚠ 注意:すべてのタスクが同時に実行できるわけではありません。例えば、生地を混ぜる前にケーキを焼くことはできません!同様に、ASGIアプリケーションでは、特定の操作(データベースクエリやファイル読み込みなど)は、まだ順番に実行する必要があるかもしれません。
Asynchronous requestsPythonシュードコードの例
WSGIスタイルの同期コード
def bake_cake(request):
mix_batter()
pour_into_pan()
bake_in_oven() # This blocks for a long time
return response
def make_frosting(request):
mix_ingredients()
stir_until_smooth()
return response
ここで make_frosting()が終わるまでは bake_cake()が終了するまで開始されない。リクエストは一度に一つずつ処理される。
ASGIスタイルの同期コード
async def bake_cake(request):
await mix_batter()
await pour_into_pan()
await bake_in_oven() # Can yield control here
return response
async def make_frosting(request):
await mix_ingredients()
await stir_until_smooth()
return response
この非同期バージョンでは bake_in_oven()が待機している間、サーバーはアイドリングせずにジャンプして make_frosting()することができる。これこそがASGIのパワーであり、ノンブロッキングで効率的なマルチタスクなのだ。
ボクシングのすべて
WSGIはケーキを焼くようなもので、オーブンに入れている間はじっとしている。ASGIは、その間にフロスティングを作ることができる。どちらにも使用例がありますが、もしあなたが スケーラブルで高性能なウェブアプリケーションが必要な場合は、ASGIが最適です。
質問や共有したいことがありますか?Vonageコミュニティ VonageコミュニティSlackまたは 開発者向けニュースレターでフォローしてください。 X(旧Twitter)YouTubeチャンネル YouTubeチャンネルビデオチュートリアルを購読する。 LinkedInのVonage開発者ページ開発者が学び、コミュニティとつながるためのスペースです。つながりを維持し、進捗状況を共有し、最新の開発者向けニュース、ヒント、イベントを把握してください!


