python

ASGIサーバーであるUvicorn・Hypercorn・Daphneの比較

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はあくまでリファレンスとして使い、開発環境には組み込まない方が無難です。