当サイトは、アフィリエイト広告を利用しています
pythonでFlaskやFastAPIでアプリケーションを開発する
際に外部サーバーとして使用する
についてそれぞれの特徴と違いを調べたのでまとめておく。
結論というかまとめから先に書くと
調べる前はこの二つのサーバーは同じようなものかと思っていたが
全然別物だった。
選ぶPythonのフレームワークにもよるが基本的には
を使えばいいと思う。
または
でいいと思う
GunicornはWSGI(Web Server Gateway Interface)サーバの一つ。
シンプルかつ、信頼性の高いサーバー
Gunicornの特徴をまとめる
Gunicornを主に同期型のWSGIアプリケーションを対象としている。
同期型なので一つずつ順番にリクエストを処理していく
処理モデルとしては同期的なリクエスト/レスポンスの処理モデル。
つまりはリクエストが来たら、サーバーはそのリクエストを処理し終わるまで
次のリクエストを処理しないということ。
Guncornの並行処理としてはマルチスレッドまたはマルチプロセスで並行処理を行うことができる。
並行処理を行うが、あくまでもリクエストは逐次的に処理する。
具体的にはマルチプロセスで並行処理を行う場合
独立したそれぞれのプロセスがそれぞれのリクエストを処理する
ただ一つのプロセスの一つのリクエストの処理は逐次的の行われるイメージ
※終わるまで次のリクエストは処理しない。
マルチスレッドはプロセスがスレッドになるだけで仕組みは同じ。
同期的なフレームワークである
でよく利用される。
※flaskは基本的には非同期には対応してない
実際にGunicornを使ったFlaskのREST APIの実装については
下記で詳しくまとめている
長所としては下記がある
設定が簡単で、デフォルトで高性能
実際使ってみるとデバッグ起動とかの処理も早い。
下記記事のflaskのREST APIでもGunicornを使っているが
Flaskのビルトインサーバーに比べると全然早いので使いやすい
多くのプロジェクトで使われているため信頼性が高い。
CPUバウンドな処理(計算量の多いタスク)には複数のCPUコアを効果的に利用できる
Gunicornのような多プロセスサーバーが向いてる。
短所としては下記がある
同期処理のため、I/Oバウンド(待ち時間が多いタスク)は向かない。
並行処理で処理を行うが逐次処理のためマルチプロセスで処理してもそれぞれで待ち時間が発生してしまうため。
UvicornはASGI(Synchronous Server Gateway Interface)サーバの一つ。
Gunicornに比べて比較的新しい。
Uvicornの特徴をまとめる
Uvicornを主に非同期型のASGIアプリケーションを対象としている。
非同期型なので一つのリクエストを処理している時間の空き時間(DBアクセス中)等に他のリクエストを
処理することができる。
処理モデルとしては非同期的なリクエスト/レスポンスの処理モデル。
つまりはリクエストが来たら、サーバーはそのリクエストの処理時間に待ち時間ができたら、別のリクエストを処理することで
効率良く多数のリクエストを処理でき、待ち時間が少なくなる。
Uvicornの並行処理としては非同期I/Oを使って並行処理を行う。
非同期I/Oはマルチプロセス(スレッド)と違い、一つのプロセスやスレッドので多くのリクエストを同時に効率よく処理する
ちなみにUvicornでもマルチプロセス(スレッド)を使うことができる。
※だが並行処理の基本的な仕組みは非同期I/Oであり、利点も非同期I/Oにある。
非同期的なフレームワークである
でよく利用される。
長所としては下記がある
非同期I/Oで待ち時間を使って別のタスクを処理できるため
I/Oバウンド(待ち時間が多いタスク)との相性がいい。
短所としては下記がある
Gunicornと比べると新しいため情報が少なく、学習コストが少し高い。
非同期に対応していないpythonライブラリは使えない。
ライブラリと同様にフレームワーク自体も非同期に対応している必要がある
例えばFlaskは対応していないので使えない。
下記記事ではFastApiで実装したREST APIをUvicornで動かしている。
具体的なUvicornの起動方法やデバッグ方法についても書いているのでよければ参考にしてください
いろいろ調べてみたが用途によってあまりどちらかを迷うことはなさそう。
Flask使うならGunicornだしFastAPIならUvicornでいいと思う。
Djangoの場合は非同期もサポートされているらしいのでどちらでもいいみたいだが
基本的には同期のフレームワークなのでGunicornかな。