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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
skanehira
September 10, 2025
Technology
1
360
Rustから学ぶ 非同期処理の仕組み
skanehira
September 10, 2025
Tweet
Share
More Decks by skanehira
See All by skanehira
Reactにおける 良いコンポーネントテストとはなにか
skanehira
1
420
vimconf2025.pdf
skanehira
0
34
findy-ai-terminal.pdf
skanehira
2
480
about_gorilla.vim.pdf
skanehira
0
120
if let temporary scopeについて
skanehira
0
200
build-debugger-in-rust.pdf
skanehira
1
260
Findy感謝祭2024 LT
skanehira
0
150
Rustではじめる負荷試験
skanehira
6
2.3k
Wellcome Vim World
skanehira
3
660
Other Decks in Technology
See All in Technology
NW構成図の自動描画は何が難しいのか?/netdevnight3
corestate55
2
490
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
14k
AWS CDK の目玉新機能「Mixins」とは / cdk-mixins
gotok365
2
290
AIエンジニア Devin と歩む、自律型運用プロセスの構築
a2ito
0
270
サンタコンペ2025完全攻略 ~お前らの焼きなましは遅すぎる~
terryu16
1
540
生成AI活用によるPRレビュー改善の歩み
lycorptech_jp
PRO
4
1.7k
[続・営業向け 誰でも話せるOCI セールストーク] AWSよりOCIの優位性が分からない編(2026年2月20日開催)
oracle4engineer
PRO
0
140
競争優位を生み出す戦略的内製開発の実践技法
masuda220
PRO
2
500
チームメンバー迷わないIaC設計
hayama17
5
3.1k
Lookerの最新バージョンv26.2がやばい話
waiwai2111
1
140
AI Agentにおける評価指標とAgent GPA
tsho
1
230
ソフトウェアアーキテクトのための意思決定術: Create Decision Readiness—The Real Skill Behind Architectural Decision
snoozer05
PRO
27
7.6k
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.2k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
470
Designing for Timeless Needs
cassininazir
0
150
Docker and Python
trallard
47
3.7k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
420
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
90
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.7k
Design in an AI World
tapps
0
160
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.3k
Bash Introduction
62gerente
615
210k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.1k
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スレッド まとめ
ありがとうございました