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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
skanehira
September 10, 2025
Technology
390
1
Share
Rustから学ぶ 非同期処理の仕組み
skanehira
September 10, 2025
More Decks by skanehira
See All by skanehira
Reactにおける 良いコンポーネントテストとはなにか
skanehira
1
430
vimconf2025.pdf
skanehira
0
41
findy-ai-terminal.pdf
skanehira
2
500
about_gorilla.vim.pdf
skanehira
0
130
if let temporary scopeについて
skanehira
0
200
build-debugger-in-rust.pdf
skanehira
1
270
Findy感謝祭2024 LT
skanehira
0
150
Rustではじめる負荷試験
skanehira
6
2.4k
Wellcome Vim World
skanehira
3
670
Other Decks in Technology
See All in Technology
AIの揺らぎに“コシ”を与える階層化品質設計
ickx
0
110
AIが盛んな時代に 技術記事を書き始めて起きた私の中での小さな変化
peintangos
0
340
Keeping Ruby Running on Cygwin
fd0
0
200
Choose your own adventure in agentic design patterns
glaforge
0
160
Angular Architecture Revisited Modernizing Angular Architectural Patterns
rainerhahnekamp
0
110
Anthropic「Long-running a gents」をGeminiで再現してみた
tkikuchi
0
750
AIが自律的に働く時代へ Amazon Quick で実現するAIエージェント紹介
koheiyoshikawa
0
160
Shipping AI Agents — Lessons from Production
vvatanabe
0
300
MySQL 9.7がやってきた ~これまでのあらすじと基本情報~ @ 日本MySQLユーザ会会2026年04月 / mysql97-yattekita
sakaik
0
150
Microsoft 365 / Microsoft 365 Copilot : 自分の状態を確認する「ラベル」について
taichinakamura
0
430
世界の中心でApp Runnerを叫ぶ FINAL
tsukuboshi
0
160
ブラウザの投機的読み込みと投機ルールAPIを理解し、Webサービスのパフォーマンスを最適化する
shuta13
1
230
Featured
See All Featured
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
140
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
10k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
SEO for Brand Visibility & Recognition
aleyda
0
4.5k
Documentation Writing (for coders)
carmenintech
77
5.3k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
380
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
450
Paper Plane (Part 1)
katiecoart
PRO
0
6.9k
Utilizing Notion as your number one productivity tool
mfonobong
4
300
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
760
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スレッド まとめ
ありがとうございました