FastAPI (PythonのAPI framework) をGunicornで動かした話
そもそもFastAPIとは
PythonのAPI frameworkです
公式ホームページはこちら
公式から引用すると、下記の特徴があるそうです
高速: NodeJS や Go 並みのとても高いパフォーマンス (Starlette と Pydantic のおかげです)。 最も高速な Python フレームワークの一つです.
高速なコーディング: 開発速度を約 200%~300%向上させます。 *
少ないバグ: 開発者起因のヒューマンエラーを約 40%削減します。 *
直感的: 素晴らしいエディタのサポートや オートコンプリート。 デバッグ時間を削減します。
簡単: 簡単に利用、習得できるようにデザインされています。ドキュメントを読む時間を削減します。
短い: コードの重複を最小限にしています。各パラメータからの複数の機能。少ないバグ。
堅牢性: 自動対話ドキュメントを使用して、本番環境で使用できるコードを取得します。
Standards-based: API のオープンスタンダードに基づいており、完全に互換性があります: OpenAPI (以前は Swagger として知られていました) や JSON スキーマ.
個人的な印象としては、Flaskより使い勝手が良くて、Djangoよりも学習コストが少ない、そして何よりドキュメントを自動で作ってくれるということで、とても使いやすいです
本題 - なにをやりたいか?
FastAPIは、下記のようにuvicornを使用して起動できます
pip install uvicorn
uvicorn main:app --reload
何も考えずにこれを使っていたのですが、社内のメンバーから指摘がありました
「uvicornのマニュアルにこんなの記載がありますよ」
For production deployments we recommend using gunicorn with the uvicorn worker class.
本番デプロイメントでは、uvicornワーカークラスでgunicornを使用することをお勧めします。
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker
ということで、gunicornを導入を試みました
やったこと
gunicornのインストール
poetry add gunicorn
私はpythonのパッケージ管理にpoetryを使っているので上のコマンド使いましたが、
pipは普通に下記でいけると思います
pip install gunicorn
起動、そしてエラー
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker
ModuleNotFoundError: No module named 'uvloop'
エラーになりました。uvloop
が存在しないらしい
解決策
pyproject.toml
のuvicornの項目を下記のように変更する
uvicorn = {extras = ["standard"], version = "^0.13.3"}
※versionは自分が使うversionにしてください。
変更後にuvicornを一度アンインストールして、poetry update
で再インストール
pipでインストールする場合は
pip install uvicorn[standard]
[standard]
をつけないと最小限のモジュールしかインストールされないので、uvloop
がなくてエラーになるようです
参考にしました:
改めて起動
先ほどと同じ起動コマンドで、こんどこそ無事に起動しました
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker
そもそも
FastAPIのドキュメントには、最初からstandard付きでインストールするように記載されていました
pip install uvicorn[standard]
結論
公式ドキュメントは、ちゃんと読もう
Discussion