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
Rustのasync/awaitとスケジューラの話 / rust-async-await
Search
Osuke
April 28, 2020
Programming
4.2k
9
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rustのasync/awaitとスケジューラの話 / rust-async-await
Osuke
April 28, 2020
More Decks by Osuke
See All by Osuke
特許データを使ったマルチモーダルAIの検証事例@LLMProd#4
osuke
0
340
dbtを中心に据えた データ分析とプロダクト開発
osuke
1
1.2k
LayerX Privacy Tech事業部紹介 Tech編
osuke
1
260
(SCIS2021) Anonify: プライバシーを保護した 検証可能な状態遷移モジュール
osuke
1
450
Rustで実装された AWS Nitro Enclaves CLIを読む
osuke
0
430
Rustのパフォーマンスに関するTips
osuke
4
4.8k
ARM TrustZone入門 / ARM TrustZone intro
osuke
21
10k
Anonify
osuke
3
1.2k
Privacy on Blockchain
osuke
1
1.3k
Other Decks in Programming
See All in Programming
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
190
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1k
Performance Engineering for Everyone
elenatanasoiu
0
230
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
950
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
300
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
140
スマートグラスで並列バイブコーディング
hyshu
0
260
Creating Composable Callables in Contemporary C++
rollbear
0
170
Webフレームワークの ベンチマークについて
yusukebe
0
180
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.5k
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
200
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
600
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
432
67k
Site-Speed That Sticks
csswizardry
13
1.2k
Docker and Python
trallard
47
3.9k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
2
250
Mind Mapping
helmedeiros
PRO
1
260
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
170
The Curious Case for Waylosing
cassininazir
1
400
WCS-LA-2024
lcolladotor
0
660
Building Adaptive Systems
keathley
44
3.1k
How to Ace a Technical Interview
jacobian
281
24k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
860
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
240
Transcript
の と スケジューラの話
About Me • • ブロックチェーン技術を軸にプライバシー保護やインターオペラビリティなど の研究開発 @zoom_zoomzo Osuke
None
LayerXでのRustの使い方 • 暗号プロトコル ◦ 安全性がクリティカル ◦ ライブラリが充実 • システムプログラミング言語として ◦
プロセッサレベルのメモリ保護機能 の利用 • などを用いてサーバーサイド開発
OSS in Rust • ゼロ知識証明ベース ◦ ◦ ◦ •
None
None
std::future::future • ステートマシンの抽象化インターフェース ◦ 将来的に値が確定する計算 • ポーリングモデル(繰り返し )で状態をできるだ け進めていく •
すると か を返す ◦ の場合は次の状態へ遷移 ◦ の場合は現在の状態のまま
std::task::Context Pending • 次回はどのタイミングでポーリングすればいいのか問題 ◦ が返ってきてすぐまたポーリングするの は 時間の無駄 • (
の )でステートマシンの状態遷移が 再開可能になるタイミングの通知を設定 • ナイーブな例 ◦ ▪ の場合、スレッドをブロック ◦ ▪ 時に、スレッドのブロックを解除 Ready
example
None
async/await • 非同期関数内で まで状態を進めていく ◦ を繰り返し実行していく • 非同期処理を同期処理のように扱えるシンタックス
async/await • 非同期関数は (再開可能 な計算)のシンタックスシュガー • 非同期関数もステートマシン
• 軽量な実行単位 ◦ メモリ消費量・時間コストが スレッドよりも圧倒 的に効率的 • ( スレッドではなく)グリーンスレッド ◦
◦ ◦ • それぞれのタスクが独立したステートマシン ◦ で生成 • それぞれの が を持つ ◦ non-blockingであることが重要 Task でタスクアロケーションの効率化
Runtime • 非同期計算の実行環境 • に渡さないとランタイムで実行されない ◦ はシステムプログラミング言語として薄く するため言語仕様には組み込まれていない ◦ や
が有名 • がそれぞれの スレッドで実行する をいい感じに配置 ◦ 公平なスケジューリング ◦ がプリエンプションしない
None
Scheduler • 単位の実行をよりパフォーマンスが出るように管理 • などでタスク実行キューをロードバランシング ◦ だと 取得時の競合でパフォーマンス低下する Task Task
Task Task Task exec Task exec
Blocking Call • 非同期タスクはすぐに計算が完了することが期待されている • タスクの移動は したところでのみ起こるので、そのポイントにたどり着くまでに 多くの時間を要する場合は他のタスク実行を妨げる可能性がある • 非同期関数内でブロッキングするタスクの呼び出しは大幅なパフォーマンス低下の
懸念 ◦ 時間のかかるシステムコールの呼び出しなど
Pollute runtime... • ブロッキングタスクが同じスレッドで実行される非同期タスクもブロックしてしまう • ランタイム全体のパフォーマンス低下につながる Task Task Task Task
Task exec Task exec
Blocking Calls in tokio • によってブロッキングな呼び出しはバックグラウンドのブロッキン グスレッドへ • 非同期タスクはブロッキングコールの影響を回避 •
グローバルなスレッドプールなので なライフタイムを持つ必要がある • の代わりに を使うと、現在のスレッドがブロッキ ングスレッドになる ◦ トレイトを要求しない
• ブロッキングする可能性のある呼び出し ◦ システムコール ▪ ▪ ◦ バウンドな重い処理 ◦ 外部クレート依存関数の呼び出し
◦ 他のタスクと同期する必要がある処理 ◦ • 開発者が呼び出す関数が かどうか考慮しバックグラウンドのブロッキング スレッドへ送る必要がある blocking?
gorourtine • スレッド ◦ ブロッキングしている処理を検出 ▪ 開発者は明示的にブロッキングタスクを処理する必要はない ◦ の検出や実行時間の長いタスクのプリエンプションにより、ブロッ キングタスクを他の実行キュー
グローバルキューにエンキュー Task Task Task Task Task exec Task exec sysmon
と の ブロッキング呼び出しに対する対応
async-std • 標準ライブラリに かつハイパフォーマンスな非同期処理イン ターフェースを提供 • とは違う独自の非同期ランタイムも提供 • エコシステム ◦
◦ ◦
async-stdの新しいスケジューラの試み • 時間がかかっているブロッキングな呼び出しをバックグラウンドのスレッドプールへ 自動的に逃す ◦ 実装を見ると少なくとも ごとに 関数を呼び 出す •
以下のような非同期関数内での時間のかかる呼び出しもスケジューラが暗黙的に ブロッキングスレッドで処理する ◦ 開発者がブロッキングコールを意識しなくてよくなる
ランタイム実行のループ内で スレッド生成を行う関数を 呼び出す スレッド タスク実行キュー 処理時間が長いタスクを検出し て新しいスレッドプールへ逃す 部分
Auto-detecting blocking calls
Benchmark https://async.rs/blog/stop-worrying-about-blocking-t he-new-async-std-runtime/
• やっていき • 厳しみ • 一部だけマージ だが、しかし。
tokio • 「 」 • プリエンプション:同じタスクを長時間実行し続けてる状態に対する割り込み処理で タスクをスケジューリング ◦ には存在しない ◦
代わりに、 で が追加 • :タスクごとのオペレーションの上限カウンタ ◦ オペレーション: ◦ タスクが一定数以上 のオペレーションを行うと自動で ◦ タスクがスイッチしたら カウンタはリセット • あくまで 対策なので、 は依然必要
まとめ • も 関数も もステートマシン ◦ や などのランタイム上で状態遷移 ◦ は軽量かつ
であることがパフォーマンス上重要 • 非同期関数内のブロッキングな呼び出しは今後も開発者が明示的に対処する 必要あり
None
We are hiring!! • 全ての経済活動をデジタル化していく仲間を募集しています! https://www.wantedly.com/projects/363053