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
380
1
Share
Rustから学ぶ 非同期処理の仕組み
skanehira
September 10, 2025
More Decks by skanehira
See All by skanehira
Reactにおける 良いコンポーネントテストとはなにか
skanehira
1
430
vimconf2025.pdf
skanehira
0
39
findy-ai-terminal.pdf
skanehira
2
490
about_gorilla.vim.pdf
skanehira
0
120
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
660
Other Decks in Technology
See All in Technology
会社紹介資料 / Sansan Company Profile
sansan33
PRO
16
410k
推し活エージェント
yuntan_t
1
820
40代からのアウトプット ― 経験は価値ある学びに変わる / 20260404 Naoki Takahashi
shift_evolve
PRO
5
830
OCI技術資料 : 証明書サービス概要
ocise
1
7.2k
2026-04-02 IBM Bobオンボーディング入門
yutanonaka
0
210
Data Enabling Team立ち上げました
sansantech
PRO
0
280
AgentCore RuntimeからS3 Filesをマウントしてみる
har1101
2
260
OpenClaw初心者向けセミナー / OpenClaw Beginner Seminar
cmhiranofumio
0
320
Podcast配信で広がったアウトプットの輪~70人と音声発信してきた7年間~/outputconf_01
fortegp05
0
230
JSTQB Expert Levelシラバス「テストマネジメント」日本語版のご紹介
ymty
0
130
スクラムを支える内部品質の話
iij_pr
0
270
Oracle Cloud Infrastructure(OCI):Onboarding Session(はじめてのOCI/Oracle Supportご利⽤ガイド)
oracle4engineer
PRO
2
17k
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
180
Measuring & Analyzing Core Web Vitals
bluesmoon
9
800
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
150
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.8k
Color Theory Basics | Prateek | Gurzu
gurzu
0
280
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
990
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
480
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
310
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
340
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
Docker and Python
trallard
47
3.8k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
340
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スレッド まとめ
ありがとうございました