CLOVER🍀

That was when it all began.

ASGIってなんだ?

これは、なにをしたくて書いたもの?

前のエントリーでPythonのWeb APIフレームワーク、FastAPIを試してみました。

PythonのWeb APIフレームワーク、FastAPIを試す - CLOVER🍀

この時、一緒にASGIサーバーというものの一種でUvicornというものを使いました。

ASGIサーバーについて知らなかったので、軽く見ておきます。

ASGI

ASGIのWebサイトはこちら。

ASGI Documentation — ASGI 3.0 documentation

ASGIは「Asynchronous Server Gateway Interface」の略で、WSGIの後継であり、Pythonの非同期Webサーバー、フレームワーク
アプリケーション間の標準インターフェースを提供することを目的としているそうです。

なお、WSGIは「Web Server Gateway Interface」の略です。

PEP 3333 – Python Web Server Gateway Interface v1.0.1 | peps.python.org

ASGIの導入はこちらに書かれています。

Introduction — ASGI 3.0 documentation

ここを読むと、WSGIをアップデートするのではなくASGIを作った理由や、WSGIとの関係も書かれています。
ASGIはWSGIのスーパーセットになっていて、両者の間の変換が可能なようです。

仕様は以下のページにまとめられています。

Specifications — ASGI 3.0 documentation

また、こちらを見るとASGIを実装したサーバーやASGIに対応したアプリケーションフレームワーク、ツールの一覧を見ることができます。

Implementations — ASGI 3.0 documentation

ASGIサーバーとしては、以下が挙げられています。

  • Daphne
  • Granian
  • Hypercorn
  • NGINX Unit
  • Uvicorn

現時点でStableなのはNGINX UnitとUvicornで、あとはベータ版のようです。

アプリケーションフレームワークは以下ですね。

  • BlackSheep
  • Connexion
  • Django/Channels
  • Esmerald
  • FastAPI
  • Litestar
  • Quart
  • Sanic
  • rpc.py
  • Starlette

現時点で、FastAPI、そしてFastAPIが依存しているStarletteはベータ版扱いになっています。

ツールとしては、以下のひとつのみのようです。

  • a2wsgi

これはWSGIとASGIのアプリケーションを相互変換するツールのようです。

ASGIサーバーとWSGIサーバー

ここまでで、ざっくりASGIサーバーというものがわかりました。

では、FastAPIのようなASGIに対応したアプリケーションはUvicornで動作させるといいのかというと、必ずしもそれだけでは
ないようです。

FastAPIの以下のドキュメントを見てみます。

Server Workers - Gunicorn with Uvicorn - FastAPI

こちらを見ると、Uvicornはシンプルプロセスで動作するものであることが書かれています。

Up to this point, with all the tutorials in the docs, you have probably been running a server program like Uvicorn, running a single process.

そして、複数のコアを利用してアプリケーションをスケールさせる必要性についても触れられています。

When deploying applications you will probably want to have some replication of processes to take advantage of multiple cores and to be able to handle more requests.

で、どうするかというとGunicornのワーカープロセスとしてUvicornを動かすという構成になるようです。

Server Workers - Gunicorn with Uvicorn / Run Gunicorn with Uvicorn Workers

また機能は限定的なようですが、Uvicornにも複数のプロセスを扱う機能はあるようです。ドキュメントを見ていると、どちらかというと
Gunicorn+Uvicornを勧めているような印象を受けますね。

Server Workers - Gunicorn with Uvicorn / Uvicorn with Workers

ちなみに、Gunicornはnginxなどのプロキシサーバーの後ろに配置することが推奨されているので、実際に使う場合は
nginx+Gunicorn+Uvicornといった構成になるのでしょうか。

Deploying Gunicorn — Gunicorn 21.2.0 documentation

おわりに

ASGIというものが気になったので、ASGIやFastAPIのドキュメントから雰囲気を見てみました。

Pythonの非同期Webアプリケーションの仕様という位置づけであることを把握しておけば、今のところは十分かなと思います。