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から学ぶ 非同期処理の仕組み
Search
skanehira
September 10, 2025
Technology
1
190
Rustから学ぶ 非同期処理の仕組み
skanehira
September 10, 2025
Tweet
Share
More Decks by skanehira
See All by skanehira
about_gorilla.vim.pdf
skanehira
0
100
if let temporary scopeについて
skanehira
0
190
build-debugger-in-rust.pdf
skanehira
1
250
Findy感謝祭2024 LT
skanehira
0
130
Rustではじめる負荷試験
skanehira
6
2.1k
Wellcome Vim World
skanehira
3
650
VimConf 2023 Tiny
skanehira
1
760
Deno Fest 2023
skanehira
0
260
RustでWasm Runtimeを書いた in WebAssembly night #11
skanehira
0
880
Other Decks in Technology
See All in Technology
今改めてServiceクラスについて考える 〜あるRails開発者の10年〜
joker1007
20
9.3k
Optuna DashboardにおけるPLaMo2連携機能の紹介 / PFN LLM セミナー
pfn
PRO
1
750
2重リクエスト完全攻略HANDBOOK / Double Request Handbook
shoheimitani
5
7.3k
BtoBプロダクト開発の深層
16bitidol
0
140
動画データのポテンシャルを引き出す! Databricks と AI活用への奮闘記(現在進行形)
databricksjapan
0
120
analysis パッケージの仕組みの上でMulti linter with configを実現する / Go Conference 2025
k1low
1
250
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
11
77k
Goに育てられ開発者向けセキュリティ事業を立ち上げた僕が今向き合う、AI × セキュリティの最前線 / Go Conference 2025
flatt_security
0
290
組織観点からIAM Identity CenterとIAMの設計を考える
nrinetcom
PRO
1
130
自作LLM Native GORM Pluginで実現する AI Agentバックテスト基盤構築
po3rin
2
210
kaigi_on_rails_2025_設計.pdf
nay3
8
4.1k
タスクって今どうなってるの?3.14の新機能 asyncio ps と pstree でasyncioのデバッグを (PyCon JP 2025)
jrfk
1
130
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Music & Morning Musume
bryan
46
6.8k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Raft: Consensus for Rubyists
vanstee
139
7.1k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
32
2.2k
The Cult of Friendly URLs
andyhume
79
6.6k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
What's in a price? How to price your products and services
michaelherold
246
12k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
A Modern Web Designer's Workflow
chriscoyier
697
190k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Transcript
Rustから学ぶ 非同期処理の仕組み
自己紹介 ゴリラです。 株式会社テックリードという会社をやってい ます。 主にフロントエンド・バックエンドエンジニ アとして仕事しています。 好物は Vim, Go, Rust,
TypeScript, Deno, Wasm などです。 X : https://x.com/gorilla0513 zenn : https://zenn.dev/skanehira GitHub: https://github.com/skanehira
本日のテーマ • Rustのコードから非同期処理の仕組みについて解説 • 主に以下のことを話す • 非同期処理 • 並行処理・並列処理 •
async/await • コルーチン • ※専門分野ではないので間違ったことを言っていたら指摘ください
はじめに • コード1, 2はともに並行で実行される • しかし動作する仕組みが異なる
非同期処理とは
非同期処理とは • 1つのタスクが待機中でも他の処理を進められる仕組み • データベースからデータが返ってくるまで他のタスクを処理する • IO待ちしている間はCPUを有効活用する
並行・並列処理とは
並行処理と並列処理の違い • 並行処理 • 一度に複数のタスクを扱うやり方 • 1つのCPUでもタスクを切り替えながら進行する
並行処理と並列処理の違い • 並列処理 • 同時に複数の処理を実行する • 複数CPUコアで物理的に同時実行する
並行処理と並列処理の違い • 並行処理は概念と実装の2つの意味がある ここが混ざって説明されていることが多い印象 • 並行性と並行処理に分けて話したほうがわかりやすそう
並行処理と並列処理の違い • 並行性 : 一度にたくさんのことを扱う構造・やり方 • 並行処理: 1つのCPUでもタスクを切り替えながら同時進行する • Rustの場合、ランタイム次第でコードが並列に動くこともある
非同期、並行・並列処理の違い
非同期、並行・並列処理の違い • 非同期処理 • 単一のタスクに着目して、実行モデル(どう待つか)からの分類 • 並行・並列処理 • 複数のタスクに着目して実行形態(どう複数を扱うか)の分類 •
分類が違うが、日常会話であんまり気にしなくてもよさそう
カフェで例える 並行処理と並列処理
カフェで例える並行処理 店員が一人のみ場合、注文受付・ドリンク・食事用意・会計などを 順に処理する
カフェで例える並行処理 コーヒーを注いでいる間に、パンを電子レンジで温めつつ、会計をす る
カフェで例える並列処理 店員の数を増やして複数の注文を同時に処理する
Rustでの非同期処理
Rustでの非同期処理 OSスレッド
Rustでの非同期処理 async/await
Rustでの非同期処理 •Rustのasync関数はコンパイル時 次のFutureトレイトの実装に変換される •Futureは非同期タスクを抽象化して表現したもの
Rustでの非同期処理 •fetch_data()をコンパイラが次の ようなコードに変換する •poll()を呼ぶことで処理が実行さ れる
Rustでの非同期処理 •poll()は進行不能になったら Poll::Pendingを返し、処理が終わっ たらPoll::Ready(T)を返す •呼び出し側はPoll::Pendingが返っ てきたら別のFuture::poll()を実 行 •.awaitはpoll()の呼び出しに相当 する
Rustでの非同期処理 •Futureを実行するのが非同期ラン タイム •非同期ランタイムはRust本体含ま れておらず、一般的にtokioといっ たサードパーティ製の物を使う
tokioのアーキテクチャの概要
tokioのアーキテクチャの概要 •ワーカー : 各OSスレッドで動作、無限ループでタスクを処理 •ローカルキュー : 各ワーカーが持つタスクキュー、256個が上限 •グローバルキュー: tokio::spawnなどで生成されたタスク初期置き場
tokioのアーキテクチャの概要 •Work Stealing: ローカルキューが空のワーカーが他のワーカーorグ ローバルキューからタスクを盗む •特定のワーカーにタスクが 溜まりすぎないようにするため
•tokioは並列処理と並行処理を併用する •各スレッドは並行処理で、複数スレッドを使って並列処理する •ランタイムの実装によってはシングルスレッドでFutureを実行するシ ンプルなものもある tokioのアーキテクチャの概要
マルチタスクについて
•複数のタスクを効率的に実行する仕組みのこと •並行・並列処理との違い •並行・並列処理: 複数のタスクをどう扱うか(論理モデル) •マルチタスク : 並行処理どう実現するか(実装モデル) •これもあんまりそんなに細かく気にしなくて良さそう マルチタスクについて
•協調的マルチタスク(ノンプリエンプティブ) •非協調的マルチタスク(プリエンプティブ) マルチタスクは2種類ある
•協調的マルチタスク(ノンプリエンプティブ) •制御: プログラム自身が「明示的に」タスクを切り替える方式 •切り替わり: yield()や.awaitなど明示的なタイミング •例: コルーチン(RustのFuture、JSのPromiseなど) •メリット: コンテキストスイッチコストが低い、予測可能 •デメリット:
柔軟にタスクの組み換えができない マルチタスクは2種類ある
•非協調的マルチタスク(プリエンプティブ) •制御: OSやランタイムが「強制的に」タスクを切り替える方式 •切り替わり: シグナルによる割り込みなど •例: OSスレッド •メリット: 基本的に任意のタイミングでタスクを切り替えられる •デメリット:
コンテキストスイッチのコストが高い マルチタスクは2種類ある
コルーチンについて
•コルーチンとは「途中で実行を中断して、あとから再開できる関数」 •async/await, ジェネレーターなど コルーチンとは
•スタックフルコルーチン •コルーチンごとにスタックを持ち、スタックを保存・復元すること で基本的にどこでも中断・再開できる •例: グリーンスレッド(後で説明) •スタックレスコルーチン •コルーチンごとにスタックを持たない、中断点でのみ中断できる •RustのFutureはスタックレスコルーチン コルーチンについて
•関数呼び出しを管理するためのLIFO •各スタックは以下の情報を持つ •戻りアドレス •引数・ローカル変数 •CPUレジスタの値: pc, spなど •このスタックを保存・復元することで コンテキストスイッチする スタックとは
グリーンスレッドについて
•スタックフルコルーチン •ユーザ空間で実装されたOSスレッドのようなもの •OSスレッドと比べると •保存する情報量が少ない •カーネルの介在不要 •コンテキストスイッチコストが低い&作成可能な数多い グリーンスレッドとは
グリーンスレッドの実装
グリーンスレッドの実装
•空いているスレッドを取得 •スレッドのスタックに呼び出 す関数のアドレスを書き込む •コンテキストスイッチすると きに、呼び出す関数のアドレ スが格納されているスタック のアドレスをコンテキストに 配置 グリーンスレッドの実装
•スレッドごとにスタック、レ ジスタ情報などを持つ •スタックは実行関数のアドレ スを保持 •ThreadContextを保存・復元 することでコンテキストス イッチする グリーンスレッドの実装
•t_yield()で現在と切り替え 先のスレッドのコンテキスト を取得して、switchでコンテ キストスイッチ グリーンスレッドの実装
•アセンブリでThreadContext を使って実行する関数をス イッチする •rdiが現在、rsiが切り替え先 のThreadContext グリーンスレッドの実装
グリーンスレッドの実装 •より詳細を知りたい人は https://www.packtpub.com/en-us/product/ asynchronous-programming-in-rust-9781805128137 を買って読んでみ てください •本日の発表した内容がほとんどこの本に詰まっています
余談: Goのgoroutineについて
• Goのgoroutineはグリーンスレッドかつ、非協調的マルチタスク • 明示的に中断する必要はなく、Goランタイムがよしなに中断・再開してくれる • スタックを保存・復元することで基本的にどこでも中断・再開 • OSシグナルで強制中断 • ただし、中断ポイントが安全かどうかをチェックしている
• 例えばシステムコール中やアトミックな操作シーケンスの場合は安全ではないの で中断できない • この2つを組みわせることで、非協調的マルチタスクを実現している • goroutineはいわば、OSスレッドのようなものをGoランタイム上で実装している Goのgoroutineについて
• Rustにもgoroutineのようなスタックフルコルーチンのクレートがある • https://github.com/Xudong-Huang/may Goのgoroutineについて
• 非同期処理: 単一タスクが待機中でも他の処理を進められる仕組み • 並行処理: 一度に複数のタスクを扱うやり方(概念モデル) • 並列処理: 一度に複数のタスクを物理的に同時実行(実行モデル) •
マルチタスク: 複数のタスクを切り替える仕組み(実行モデル) • 協調的: 明示的に切り替え • コルーチン: 中断・再開できる関数 • スタックレス: await/yieldなどの中断点のみ再開可能 • スタックフル: 任意の場所で再開可能 • グリーンスレッド: ユーザ空間で実装されたスタックフルコルーチン • 非協調的: OSやランタイムで割り込みで強制的に切り替え • OSスレッド まとめ
ありがとうございました