当サイトは、アフィリエイト広告を利用しています

【Python】GunicornとUvicornの特徴と違いについて

作成日:2024月09月06日
更新日:2024年09月06日

pythonでFlaskやFastAPIでアプリケーションを開発する
際に外部サーバーとして使用する

  • Gunicorn
  • Uvicorn

についてそれぞれの特徴と違いを調べたのでまとめておく。

結論というかまとめから先に書くと
調べる前はこの二つのサーバーは同じようなものかと思っていたが
全然別物だった。

選ぶPythonのフレームワークにもよるが基本的には

  • 非同期処理をしたいならUvicorn
  • 同期処理をしたいならGunicorn

を使えばいいと思う。

または

  • FastAPIならUvicorn
  • FlaskならGunicorn

でいいと思う

Gunicornとは?

GunicornはWSGI(Web Server Gateway Interface)サーバの一つ。
シンプルかつ、信頼性の高いサーバー

特徴

Gunicornの特徴をまとめる

同期型

Gunicornを主に同期型のWSGIアプリケーションを対象としている。
同期型なので一つずつ順番にリクエストを処理していく

処理モデル

処理モデルとしては同期的なリクエスト/レスポンスの処理モデル。
つまりはリクエストが来たら、サーバーはそのリクエストを処理し終わるまで
次のリクエストを処理しないということ。

並行処理

Guncornの並行処理としてはマルチスレッドまたはマルチプロセスで並行処理を行うことができる。
並行処理を行うが、あくまでもリクエストは逐次的に処理する。

具体的にはマルチプロセスで並行処理を行う場合
独立したそれぞれのプロセスがそれぞれのリクエストを処理する
ただ一つのプロセスの一つのリクエストの処理は逐次的の行われるイメージ
※終わるまで次のリクエストは処理しない。

マルチスレッドはプロセスがスレッドになるだけで仕組みは同じ。

用途

同期的なフレームワークである

  • flask

でよく利用される。
※flaskは基本的には非同期には対応してない

実際にGunicornを使ったFlaskのREST APIの実装については
下記で詳しくまとめている

長所

長所としては下記がある

設定が簡単

設定が簡単で、デフォルトで高性能
実際使ってみるとデバッグ起動とかの処理も早い。

下記記事のflaskのREST APIでもGunicornを使っているが
Flaskのビルトインサーバーに比べると全然早いので使いやすい

信頼性が高い

多くのプロジェクトで使われているため信頼性が高い。

CPUバウンドな処理に強い

CPUバウンドな処理(計算量の多いタスク)には複数のCPUコアを効果的に利用できる
Gunicornのような多プロセスサーバーが向いてる。

短所

短所としては下記がある

I/Oバウンドの処理には向かない

同期処理のため、I/Oバウンド(待ち時間が多いタスク)は向かない。
並行処理で処理を行うが逐次処理のためマルチプロセスで処理してもそれぞれで待ち時間が発生してしまうため。

Uvicornとは?

UvicornはASGI(Synchronous Server Gateway Interface)サーバの一つ。
Gunicornに比べて比較的新しい。

特徴

Uvicornの特徴をまとめる

非同期型

Uvicornを主に非同期型のASGIアプリケーションを対象としている。
非同期型なので一つのリクエストを処理している時間の空き時間(DBアクセス中)等に他のリクエストを
処理することができる。

処理モデル

処理モデルとしては非同期的なリクエスト/レスポンスの処理モデル。
つまりはリクエストが来たら、サーバーはそのリクエストの処理時間に待ち時間ができたら、別のリクエストを処理することで
効率良く多数のリクエストを処理でき、待ち時間が少なくなる。

並行処理

Uvicornの並行処理としては非同期I/Oを使って並行処理を行う。
非同期I/Oはマルチプロセス(スレッド)と違い、一つのプロセスやスレッドので多くのリクエストを同時に効率よく処理する

ちなみにUvicornでもマルチプロセス(スレッド)を使うことができる。
※だが並行処理の基本的な仕組みは非同期I/Oであり、利点も非同期I/Oにある。

用途

非同期的なフレームワークである

  • FastAPI

でよく利用される。

長所

長所としては下記がある

I/Oバウンドな処理に強い

非同期I/Oで待ち時間を使って別のタスクを処理できるため
I/Oバウンド(待ち時間が多いタスク)との相性がいい。

短所

短所としては下記がある

学習コストが比較的高い

Gunicornと比べると新しいため情報が少なく、学習コストが少し高い。

pythonライブラリの非同期対応

非同期に対応していないpythonライブラリは使えない。

フレームワークの非同期対応

ライブラリと同様にフレームワーク自体も非同期に対応している必要がある
例えばFlaskは対応していないので使えない。

まとめ

いろいろ調べてみたが用途によってあまりどちらかを迷うことはなさそう。
Flask使うならGunicornだしFastAPIならUvicornでいいと思う。

Djangoの場合は非同期もサポートされているらしいのでどちらでもいいみたいだが
基本的には同期のフレームワークなのでGunicornかな。

新着記事

タグ別一覧
top