Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
FastAPIでのasync defとdefの使い分け
Search
Takashi Sasaki
September 27, 2024
Technology
7.9k
19
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.6k
第3回AI王YAMALEXソリューション
takashi1029
0
1.2k
Other Decks in Technology
See All in Technology
ソフトウェア ファクトリー - 再現性のあるソフトウェアの工場づくり / Software factory
iktakahiro
7
5.1k
スプシの手作業からの解脱 ~更新はClaude Codeに、見せ方と使い方はGASアプリに任せる~
kentarofujii
0
160
日本語に強いオープンな大規模言語モデル「LLM-jp」
odashi
5
1.2k
古い指輪から広がった JAVA コミュニティ とのつながり
yamad
0
130
JAWSUG TOHOKU 青森支部 「LoGoチャット」のAWS移行で 乗り越えたこと
taketakekaho
0
350
コンテナ運用におけるネットワーク・コンテナコストの削減方法/How to Reduce Network and Container Costs in Container Operations
masakiokuda
2
310
CTO Night|NotionのAIエージェントとFDE
kzkhykw1991
0
240
『SAR衛星データ解析入門』のご紹介とその応用
syuchimu
0
130
フィンテック養成勉強会#68
finengine
0
160
ブラウザとサーバーから考えるAI時代のフロントエンド監視
shogo4131
3
1k
How to Design Configuration for Rails Applications
willnet
1
850
事業成長とデータ活用を止めないためのマネジメントへ挑戦
hiracky16
0
410
Featured
See All Featured
Site-Speed That Sticks
csswizardry
13
1.6k
A Soul's Torment
seathinner
8
3.8k
RailsConf 2023
tenderlove
30
1.6k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
850
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
280
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
890
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
940
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
490
Visualization
eitanlees
153
17k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
830
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.