使用 FastAPI 进行外部 API 请求或 I/O 处理时需要注意的事项
[
[
](https://zenn.dev/topics/python)[
](https://zenn.dev/topics/python)[
](https://zenn.dev/topics/web)[
](https://zenn.dev/topics/web)[
](https://zenn.dev/topics/fastapi)[
](https://zenn.dev/topics/fastapi)[
](https://zenn.dev/topics/%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86)[
](https://zenn.dev/topics/%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86)[
](https://zenn.dev/topics/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AB%E3%83%BC%E3%83%97)[
](https://zenn.dev/topics/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%AB%E3%83%BC%E3%83%97)[
](https://zenn.dev/tech-or-idea)
](https://zenn.dev/tech-or-idea)
最近、業務でFastAPIを使って開発をしているのですが、初心者向けのフレームワークのFlask等と同じと思い(Flaskにイベントループが搭載されたのが2021年5月11日2.0.0のリリース時のため自分が使っていた時には存在しなかった...)、特に意識せずにAPIを書いていたら将来的に思わぬパフォーマンス低下を招く書き方になっていたため、その点についてまとめたいと思います。
自身の知識不足への戒めも込めて、いつでも思い出せるように記事として残しておきます。
最近我在业务中使用 FastAPI 进行开发,但最初以为它和面向初学者的 Flask 等框架一样(Flask 在 2021 年 5 月 11 日发布的 2.0.0 才加入事件循环支持,而我当时使用的版本还没有……),于是无意识地编写 API,结果采用了未来可能导致性能下降的写法。因此想对此做个总结。
也包含对自身知识不足的反省,写成文章以便随时回顾。
FastAPIは、その名の通り非常に高速なパフォーマンスを誇るPythonのWebフレームワークです。しかし、そのパフォーマンスを最大限に引き出すためには、非同期処理と同期処理の違いを正しく理解し、適切に扱う必要があります。
FastAPI 正如其名,是一款以极高性能著称的 Python Web 框架。但要想把它的性能发挥到极致,就必须正确理解并恰当区分非同步处理与同步处理。
当時(学生の頃)自分はよく分からず他のフレームワークと何が違うんだと思いながら、Python=遅い言語のイメージだったのでフレームワークでどうにかなるものなのかと首を傾げていたのですが、違いは処理の仕方にありました。 リクエストが来た際、2種類の処理方法がありました。1つはなじみの同期処理でもう一つがasync awaitを使用した非同期処理になります。
那时候(学生时代)我自己也搞不太懂跟别的框架到底差在哪,只觉得“Python = 慢语言”,于是抱着“在框架里总能做点什么吧”的想法去摸索,结果发现差异在于处理的方式。请求进来时有两条路线:一条是传统的同步处理,另一条是使用 async await 的异步处理。
自分は「非同期処理」という言葉を「並列処理」や「並行処理」の総称のように捉えていましたが、正しくは、非同期プログラミングは「並行処理」を実現するための一つの手段であり、「並列処理」とは区別される概念でした。
我以前把“非同步处理”这个词当成“并发处理”或“并行处理”的总称,但准确地说,非同步编程是实现“并行处理”的一种手段,与“并发处理”是不同的概念。
用語の整理
术语整理
- 並列処理
- 複数の処理が、複数のCPUコアなどで物理的に同時に実行されること。
- 並列処理
- 複数の処理が、複数のCPUコアなどで物理的に同時に実行されること。
- 同期処理
- 同步处理
- 非同期処理
- 並行処理(マルチスレッド方式)
- 複数のスレッドを使用して処理がリクエスト待ちなどで手持ち無沙汰になった際、処理スレッドを切り替えて別の処理を行う。無駄な待ち時間を有効活用
- メモリ空間を共有するため同じ変数などに処理を行う際に競合が発生する可能性があり思わぬ不具合を埋め込む可能性がある
- 並行処理(シングルスレッド方式、イベントループと呼ばれるもの)
- 並行処理を1つのスレッドで行う。スレッド切り替え時のコンテキストスイッチなど発生されない。メモリ空間は共有されるが単一スレッ...
- 並行処理(マルチスレッド方式)