ASGIアプリケーションの実行には、候補としてUvicorn・Hypercorn・Daphneの3つがあります。
それぞれの概要と起動方法をみておきます。
ASGIアプリケーション
それぞれの特徴を見る前に、確認用のASGIアプリを作成しておきます。
次のコードは、HTTPのレスポンスボディとしてurlのパスを送信します。
main.py
async def app(scope, receive, send):
headers = [(b"content-type", b"text/html")]
await send({"type": "http.response.start", "status": 200, "headers": headers})
await send({"type": "http.response.body", "body": scope["raw_path"]})
これを別々のサーバーで実行してみます。
使い捨ての仮想環境を用意したほうが良いかもしれないので、任意で用意してください。
早速インストールしていきます。
pip install uvicorn hypercorn daphne
Uvicorn
UvicornはFastAPIの公式サイトでも用いられています。最も使用率の高いサーバーでもあります。
uvloopと呼ばれる超高速asyncioイベントループを用いることもでき高速に動作します。
wWebSocketとHTTP/1.1はサポートしていますが、HTTP/2はまだサポートしていません。
ただ、サポートするように計画中ではあるようです。
起動方法はこちら
uvicorn --host 0.0.0.0 --port 8000 main:app
http://0.0.0.0:8000/api/products
にアクセスすると画面にパスが表示されるはずです。
Hypercorn
HyperconはWSGIであるGunicornの影響を受けて開発されたASGIサーバーです。HypercornはHTTP/2、ASGI/2、ASGI/3の仕様もサポートしています。
元々は、Quartと呼ばれる非同期PythonWebマイクロフレームワークの一部でしたが、分離されて今は別のフレームワークでもASGIサーバーとして利用されています。
起動方法はこちら
hypercorn --bind 0.0.0.0:8000 main:app
Daphne
おそらくDaphneが最初のASGIサーバーでDjangoプロジェクトから来ています。HypercornのようにHTTP/2のサポートしていますが、Twistedと呼ばれるイベント駆動型のネットワークエンジンを使って実装されているため、依存関係にあるパッケージを全てインストールする必要があります。
Daphneは安定しているのがメリットで、ASGIのリファレンスとしては有能です。
使用するのは、UvicornかHypercornにしておきましょう。
起動方法はこちら
daphne --bind 0.0.0.0 --port 8000 main:app
まとめ
基本的にはUvicornを選択で良いと思います。
ただ、HTTP/2を使いたいという明確な意図があるのであれば、Hypercornを選択する必要があります。
FastAPIとHypercornを組み合わせてデプロイするケースも多々あるので相性は悪くありません。
Daphneはあくまでリファレンスとして使い、開発環境には組み込まない方が無難です。