Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
FastAPIでのasync defとdefの使い分け
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Takashi Sasaki
September 27, 2024
Technology
7.6k
15
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
FastAPIでのasync defとdefの使い分け
Takashi Sasaki
September 27, 2024
More Decks by Takashi Sasaki
See All by Takashi Sasaki
Semantic KernelでGPTと外部ツールを連携する
takashi1029
2
3.5k
第3回AI王YAMALEXソリューション
takashi1029
0
1.2k
Other Decks in Technology
See All in Technology
いまさら聞けない「仕様駆動開発入門」 〜AI活用時代の開発プロセスを考える〜
findy_eventslides
2
230
はてなのサービス基盤を支える Kubernetes《足腰》
masayoshimaezawa
0
160
[チョークトーク資料]AWS DevOps Agent を使いこなす / AWS Dev Ops Agent Chalk Talk AWS Summit Japan 2026
kinunori
4
800
データレイクの「見えない問題」を可視化する
sansantech
PRO
1
220
5分でわかるDuckDB Quack
chanyou0311
4
260
AIチャット検索改善の3週間
kworkdev
PRO
2
200
When Platform Engineering Meets GenAI
sucitw
0
200
気軽に使える"情報のハブ"としてのNotion活用 〜フロー情報の集積点 と、 Claude Code × Notion AI〜
syucream
1
210
Deep Data Security 機能解説
oracle4engineer
PRO
2
230
5分でわかる Amazon Connect_20260608
hwangbyeonghun
0
130
GitHub Copilot運用のリアル ~AI Credit時代にどう向き合うか~
takafumisu2uk1
0
480
AI時代における最適なQA組織の作り方
ymty
3
140
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
160
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Leo the Paperboy
mayatellez
7
1.9k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
790
The Spectacular Lies of Maps
axbom
PRO
1
820
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.5k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
400
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
210
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
280
Crafting Experiences
bethany
1
190
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
440
Transcript
Copyright © Acroquest Technology Co., Ltd. All rights reserved. PyCon
JP 2024 DAY1 FastAPIのasync defとdefの使い分け Acroquest Technology株式会社 佐々木 峻 1
CONFIDENTIAL Copyright © Acroquest Technology Co., Ltd. All rights reserved.
佐々木 峻 Acroquest Technology株式会社 執筆 Interface誌 • 2023年Interface 4月号 ChatGPTについて • 2023年Interface 11月号 ローカルLLMについて • 2024年Interface 8月号 GPU x ローカルLLMについて 開発 • NLP/検索が専門 • LLMを使ったRAGソリューションの開発 資格 • Azure Developer Associate • Azure Data Engineer Associate • Azure Data Scientist Associate
目次 Copyright © Acroquest Technology Co., Ltd. All rights reserved.
3 1. Pythonにおける並行処理・並列処理・非同期処理 2. マルチスレッドとasync/await 3. FastAPIでのasync defとdefの違い 4. 検証 5. まとめ
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 4
前提 CPUは意外と暇 I/Oを待っている間、CPUは何もしてない。暇。 外部アクセス等のI/O処理が多いとき、CPUはその性能をフルに発揮できてない I/O待ち CPU処理 例)DBアクセスが発生するWebサーバの処理 ※I/O待ちが多い処理を「I/Oバウンド」、I/O待ちではなくCPU処理が多い場合 を「CPUバウンド」と呼ぶ。 今回取り上げたいのはI/Oバウンドな処理 サーバ 処理 I/O待ち サーバ 処理 I/O待ち DBアクセス DBアクセス
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 5
前提2 暇してもらっては困る CPUは明らかに暇なのに、何も効率化しないと、 CPUが忙しくないが利用者は待たされる事態となる Aさんのリクエスト 例)DBアクセスが発生するWebサーバの処理で、1プロセス1コアで何も考えずに処理した場合 このあと説明する並列処理、並行処理、非同期処理などで暇をなくすことが重要! Bさんのリクエスト Cさんのリクエスト サーバ 処理 I/O待ち サーバ 処理 サーバ 処理 I/O待ち サーバ 処理 サーバ 処理 I/O待ち サーバ 処理 待機 さらに待機…
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 6
Pythonにおける並列処理・並行処理・非同期処理 VS VS 並列処理 並行処理 非同期処理
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 7
Pythonにおける並列処理・並行処理・非同期処理 VS VS マルチプロセス マルチスレッド async/await Pythonでの実装方法 並列処理 並行処理 非同期処理
CPUコア1 CPUコア1 CPUコア1 それぞれのイメージ Copyright © Acroquest Technology Co., Ltd.
All rights reserved. 8 並列処理 並行処理 非同期処理 処理 I/O待ち I/O待ち イベントループ マルチプロセス マルチスレッド async/await 処理 I/O待ち 処理 I/O待ち 処理 I/O待ち 処理 処理 処理 CPUコア2 処理 I/O待ち CPUコア3 処理 I/O待ち • 処理をプロセスとして起動 • プロセスごとにCPUコアを割り 当てて同時並列に処理 プロセス1 プロセス2 プロセス3 スレッド1 スレッド2 スレッド3 • 処理をスレッドとして起動 全スレッドは1コアで動作 • I/O待ち中に他のスレッドが処理を 進めることで同時処理 • 1コアで処理を実施 • I/O待ちの開始終了はイベント ループが管理。待ちが終了次第、 空きを見つけて続きの処理を それぞれ実施 処理 処理 処理 処理 処理 処理 処理 処理 処理
Copyright © Acroquest Technology Co., Ltd. All rights reserved. 9
Pythonにおける並列処理・並行処理・非同期処理 並列処理 並行処理 非同期処理 マルチプロセス マルチスレッド async/await • multiprocessingという 標準ライブラリを利用 Pythonでの 実装 • threadingという 標準ライブラリを利用 • async/await機能を利用 • プロセス自体を分けるので CPUリソースを効率よく 使うことができる メリット • API呼び出しなどのI/O バウンドな処理の場合に 高速化が期待できる。 • 共有リソースの実装などが 比較的容易 • API呼び出しなどのI/O バウンドな処理の場合に 高速化が期待できる。 • プロセス間の値の受け渡し などの実装がやや難しい デメリット • コンテキストスイッチが ありスレッドが増えると 速度が低下する • 非同期処理を利用する時 にはasync/await専用の 実装が必要。
それぞれのイメージ Copyright © Acroquest Technology Co., Ltd. All rights reserved.
10 なぜスレッドが分かれているのに 順番を待っているのか? CPUコア1 CPUコア1 CPUコア1 並列処理 並行処理 非同期処理 処理 I/O待ち I/O待ち イベントループ マルチプロセス マルチスレッド async/await 処理 I/O待ち 処理 I/O待ち 処理 I/O待ち 処理 処理 処理 CPUコア2 処理 I/O待ち CPUコア3 処理 I/O待ち プロセス1 プロセス2 プロセス3 スレッド1 スレッド2 スレッド3 処理 処理 処理 処理 処理 処理 処理 処理 処理
Pythonにおけるマルチスレッドの罠 Copyright © Acroquest Technology Co., Ltd. All rights reserved.
11 1. Javaだとスレッドを分けるとコアを複数利用できるが、 Pythonだと1つのコアしか利用できない ⇒Global Interpreter Lock 2. Pythonの処理系の一つであるCPythonなどにある制約 • JythonなどGILがない処理系もあるので、その場合は 今回の話の対象外 3. Pythonでは一つのプロセスが同時に実行できるスレッドは 一つだけ。 4. なので、CPUを多く使う処理ではマルチスレッドにしても マルチプロセスとは違い高速化はしない。 5. 左のようにI/O待ちがある処理では、I/O待ちのときにス レッドを切り替えて処理を進められる。 並行処理 マルチスレッド 処理 I/O待ち 処理 I/O待ち 処理 I/O待ち
それぞれのイメージ Copyright © Acroquest Technology Co., Ltd. All rights reserved.
12 やっていること同じなのでは? CPUコア1 CPUコア1 CPUコア1 並列処理 並行処理 非同期処理 処理 I/O待ち I/O待ち イベントループ マルチプロセス マルチスレッド async/await 処理 I/O待ち 処理 I/O待ち 処理 I/O待ち 処理 処理 処理 CPUコア2 処理 I/O待ち CPUコア3 処理 I/O待ち プロセス1 プロセス2 プロセス3 スレッド1 スレッド2 スレッド3 処理 処理 処理 処理 処理 処理 処理 処理 処理
マルチスレッドとasync/await Copyright © Acroquest Technology Co., Ltd. All rights reserved.
13 スレッドの切り替えにもコストがかかる 切り替え時間 並行処理 非同期処理 マルチスレッド async/await 一つのスレッドの中でI/O待ちのときに次 の処理を進めているだけ。 スレッドの切り替えは、async/awaitの処理切替 よりも時間がかかる。(コンテキストスイッチ)
マルチスレッドとasync/await Copyright © Acroquest Technology Co., Ltd. All rights reserved.
14 スレッドの切り替えにもコストがかかる スレッド数が増えるとasync/awaitに対してマルチスレッドの方が スレッドの切り替え分処理時間が長くなる 切り替え時間 並行処理 非同期処理 マルチスレッド async/await
マルチスレッドとasync/await Copyright © Acroquest Technology Co., Ltd. All rights reserved.
15 async/awaitは実装に慣れが必要(個人の感想です) 1. これまで同期処理しか書いてこなかったエンジニアからすると最初はなじみづらい。 2. async/awaitを使用する場合、その処理内で呼ばれるメソッドなどはすべてasync/awaitを 意識したコードにする必要があり、ライブラリも対応したものしか使えない。 例)requestsライブラリはasyncに対応していない。
マルチスレッドとasync/await Copyright © Acroquest Technology Co., Ltd. All rights reserved.
16 async/awaitは実装に慣れが必要(個人の感想です) マルチスレッドの場合
マルチスレッドとasync/await Copyright © Acroquest Technology Co., Ltd. All rights reserved.
17 async/awaitは実装に慣れが必要(個人の感想です) async/awaitの場合
FastAPIにおけるasync defとdefの違い Copyright © Acroquest Technology Co., Ltd. All rights
reserved. 18 async defは非同期処理、defはマルチスレッド 1. FastAPIはPath Operation関数をdefで書いた場合、リクエストを受けたらスレッドを自動 で起こしてくれる。 2. async defで書かれている場合は、非同期処理にとして扱われるため、スレッドは作成され ない。 defを利用する場合 async defを利用する場合
FastAPIにおけるasync defとdefの違い Copyright © Acroquest Technology Co., Ltd. All rights
reserved. 19 async defは非同期処理、defはマルチスレッド 1. FastAPIはPath Operation関数をdefで書いた場合、リクエストを受けたらスレッドを自動 で起こしてくれる。 2. async defで書かれている場合は、非同期処理にとして扱われるため、スレッドは作成され ない。 async defの中で同期処理を実装すると、シングルスレッドの同期処理になってしまう
検証 Copyright © Acroquest Technology Co., Ltd. All rights reserved.
20 async def+同期処理はどれくらい遅くなるのか 1. OpenAIのAPIにリクエストを投げる処理を例に実験してみる。 2. async def+同期処理とdef+同期処理で実装したAPIに、それぞれに1分間に100リクエスト 送ってレスポンスタイムの推移を比較する 環境 1. クラウド上のLinux VM(vCPU:1, メモリ:1GB, OS: Linux) 2. Python 3.12
検証 Copyright © Acroquest Technology Co., Ltd. All rights reserved.
21 async def+同期処理とdef+同期処理のAPIエンドポイントを用意する
検証 Copyright © Acroquest Technology Co., Ltd. All rights reserved.
22 応答時間の推移 async def + 同期処理の場合 def + 同期処理の場合
検証 Copyright © Acroquest Technology Co., Ltd. All rights reserved.
23 応答時間の推移 async def + 同期処理の場合 def + 同期処理の場合 async def + 同期処理の場合はリクエストを 送るにつれてレスポンスタイムが伸びている ⇒リクエストが前の処理待ちで溜まっている
まとめ Copyright © Acroquest Technology Co., Ltd. All rights reserved.
24 Pythonにおけるマルチプロセス・マルチスレッド・async/awaitは 処理がCPUバウンドかI/Oバウンドで使い分けるのが良い FastAPIにおけるPath Operation関数のasync defはasync/await、 defはマルチスレッドとして処理される Fast APIのasync def内で同期処理として実装すると、パフォーマンス 問題につながるので、同期処理の場合はdefを使う async defはコンテキストスイッチがない分、マルチスレッドよりも高速 なので、実装さえできれば大量のリクエストをさばきたい場合は有効 1 2 3 4
25 ご清聴ありがとうございました。 Copyright © Acroquest Technology Co., Ltd. All rights
reserved.