Open14

FastAPIのプラグインとTips

shimakaze_softshimakaze_soft

FastAPI Utilities

https://github.com/dmontagu/fastapi-utils

  • プロジェクト間で共通の機能を再利用できる便利な多数のユーティリティ
  • クラスベースビュー:関連するエンドポイントで同じ依存関係を重複定義をなくせる
  • SQLAlchemyのセッション管理

FastAPI-Restful

https://github.com/yuval9313/fastapi-restful

  • リソースクラス:REST APIを簡単に実装できる
  • クラスベースビュー:関連するエンドポイントで同じ依存関係を重複定義をなくせる
  • SQLAlchemyのセッション管理

主な使い方

https://scrapbox.io/PythonOsaka/FastAPIでWebサービスを保護してみる

shimakaze_softshimakaze_soft

バックグラウンド実行

FastAPIにはCeleryみたいな簡易的なバックグラウンド実行の機能がある

https://qiita.com/uezo/items/8225e33dfe0e342d0271

https://snuow.com/2022/06/プログラム/【python】fastapiで重い処理をバックグラウンドのタスク/

Celeryとの違い

  • BackgroundTasks:FastAPIアプリとメモリや変数を共有する場合や、比較的軽量の処理を行う場合に有用
  • Celery(など):メッセージキューを細かく管理したい場合や、比較的重い処理を行う場合に有用
shimakaze_softshimakaze_soft

ASGIサーバーの比較

  • Uvicorn
  • Hypercorn
  • Daphne

Uvicorn

UvicornはFastAPIの公式サイトでも用いられている。
最もオーソドックスで使用率の高いサーバーでもある。

uvloopと呼ばれる超高速asyncioイベントループを用いることもでき高速に動作する。
wWebSocketとHTTP/1.1はサポートしているが、HTTP/2はまだサポートしていない。

Hypercorn

WSGIであるGunicornの影響を受けて開発されたASGIサーバー。

  • HTTP/2
  • ASGI/2
  • ASGI/3

上記の仕様もサポートしている。

元々は、Quartと呼ばれる非同期PythonWebマイクロフレームワークの一部だったが、分離されて今は別のフレームワークでもASGIサーバーとして利用されている。

Daphne

https://techpr.info/python/uvicorn-hypercorn-daphne/

shimakaze_softshimakaze_soft

非同期処理周り

FastAPIは、defで作成されたpath関数は、自動的にマルチスレッド化されて平行処理される。

asyncを使用するのであれば、そのpath関数から呼ばれる全ての処理をasync対応にする必要がある。
それをしなければ、パフォーマンス上の問題が発生する可能性がある。

async defで作成された場合は、単一スレッドとして処理される。

全ての処理がasync対応されていれば単一スレッドでも、awaitのタイミングで逐次切り替えて平行処理が可能だが、ブロッキングとなるようなdef関数が間に入ると、awaitのような切り替え処理もされず、さらにマルチスレッドでもないので後続の処理が全てそこで待たされる、という現象が発生する。

コンテナやDBのスペックも問題ないはずなのに、なぜかアクセスが遅くなる時がある

という場合は、この現象が起きている可能性がある。