https://d226lax1qjow5r.cloudfront.net/blog/blogposts/how-pythons-wsgi-vs-asgi-is-like-baking-a-cake/flask-vs-fastapi_2.png

PythonのWSGIとASGIはケーキを焼くようなもの?

最終更新日 November 16, 2021

所要時間:1 分

この記事の更新者 ダイアナ・ファム2025年4月

はじめに

WSGIとASGIの違いに戸惑ったことがあるのは、あなただけではありません!ケーキを焼くという簡単な(そしておいしい)例えを使って説明しましょう。

WSGIとASGIとは?

WSGI (Web Server Gateway Interface) と ASGI (Asynchronous Server Gateway Interface) は Python Web サーバーが Web アプリケーションとどのように通信するかを定義します。WSGIとASGIはWebサーバーとPythonフレームワークの間に位置し、送られてくるリクエストを処理します。しかし、これらは基本的に異なる方法でリクエストを扱います。

Visual of the flow of the interface being used with a laptop at the start and an arrow pointing to a web server pointing to a WSGI or ASGI to a web applicationWSGI 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分かかるとしたら、焼き始める前に待たされることになる。 始める前に待つことになる。これは同期処理であり、ただ待っているだけであっても、タスクが重なることはない。

Three horizontal bars labeled A, B, and C, arranged diagonally downward from left to right. Bar A is magenta and positioned at the top left. Bar B is light blue and placed slightly lower and to the right of A. Bar C is orange, the longest of the three, located at the bottom right. Each bar has its corresponding label above it in magenta text.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アプリケーションでは、特定の操作(データベースクエリやファイル読み込みなど)は、まだ順番に実行する必要があるかもしれません。

Three horizontal bars labeled A, B, and C, stacked vertically. Bar A is magenta and the longest, starting furthest to the left. Bar B is light blue and shorter, positioned slightly to the right of A. Bar C is orange and wider than B, starting further right than both A and B. Each bar has its label (A, B, C) above or beside it in magenta text.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開発者ページ開発者が学び、コミュニティとつながるためのスペースです。つながりを維持し、進捗状況を共有し、最新の開発者向けニュース、ヒント、イベントを把握してください!

シェア:

https://a.storyblok.com/f/270183/400x401/df70d85a84/tonya-sims-1.png
Tonya Simsヴォネージの卒業生

TonyaはVonageの元Python Developer Advocateです。