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
Cancel Safetyとスレッドリーク
Search
garasubo
July 24, 2024
750
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Cancel Safetyとスレッドリーク
garasubo
July 24, 2024
More Decks by garasubo
See All by garasubo
RustでISUCONに勝つには
garasubo
1
810
Rustでの自作OSをやってきて
garasubo
0
1.3k
Armの仮想化支援機構を用いてハイパーバイザーを自作する
garasubo
3
8k
RustからX Window Systemを触る
garasubo
0
700
Rustで始める自作組込みOS
garasubo
1
3.6k
クラウド向けOS(?)Unikernelとは何か
garasubo
0
1.8k
論文紹介:KVM/ARM: The Design and Implementation of the Linux ARM Hypervisor
garasubo
0
680
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
528
40k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
470
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
sira's awesome portfolio website redesign presentation
elsirapls
0
310
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Color Theory Basics | Prateek | Gurzu
gurzu
0
400
Building AI with AI
inesmontani
PRO
1
1.1k
GraphQLとの向き合い方2022年版
quramy
50
15k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Transcript
Cancel Safetyと スレッドリーク Rustでも怖い非同期プログラミング
自己紹介 • ハンドルネーム:ガラスボー(@garasubo) • 現在はIdein株式会社に所属 – IoTプラットフォームの開発を担当 – RustをサーバーサイドやIoT端末上で利用 –
エンジニア以外も積極採用中なので興味があれば採用ページを
Cancel Safetyとスレッドリーク • Rustでの非同期プログラミングのおさらい • tokio::selectとcancel safety • プロダクションで起きたスレッドリーク事件
Rustでの非同期プログラミング
Rustでの非同期プログラミング async/.await構文登場以前だと非同期処理の扱いは デファクトがなくライブラリも乱立状態 async/.await構文登場以降はtokioをランタイムとして利用した async/.awaitを使った非同期プログラミングが主流に
tokioとは • Rustの汎用非同期ランタイム • async/.await構文を利用するには何かしらの非同期ランタイムが必要 – スレッド管理やスケジューリングの仕方をカスタマイズできるようにするため – Rustのstd側での提供はなく、よく使われるのがtokio –
詳しい仕組みはAsync Programming in Rustなどを参照 • 多くの非同期処理が絡むライブラリもtokioに依存している場合が多い
tokio::selectと cancel safety
tokio::select • 複数のasync関数を同時に実行して先に終了した方の結果を返すマクロ • 選ばれなかった方のfutureはcancelされて結果が破棄される 選ばれなかった場合のことを考えて、途中で終了しても困らないような関数の みを呼び出す必要がある
tokio::select
Cancel Safety 途中で終了してもデータが欠損したりせず困らないという性質 Cancel Safeでない例: tokio::io::AsyncReadExt::read_exact • 指定されたバッファの長さを全部埋めるまでデータを読み込む • キャンセルされるとバッファにある程度データを取り込んだ状態になるため、途中まで
取り込んだデータが失われてしまう tokioの関数であればcancel safeなものはcancel safeだと書いてあるので ドキュメントを読みましょう
Cancel Safeの見極め方 asyncな関数はawaitが呼び出される箇所でのみ中断される可能性がある async中のあらゆるawaitポイントで実行が止まっても内部状態が失われないこと この性質は型としては表現されないのでコンパイルエラーにはならない
プロダクションで起きた スレッドリーク事件
スレッドリーク事件 右のようなコードを書いたところスレッドが 無限に生成されてプログラムがスタックした
スレッドリーク事件 tokio::selectが呼び出され、 waitとwait2のうちどちらかを待つ wait2が先に終わるとループが続 行し、再びtokio::selectでwait とwait2のどちらかを待つ
スレッドリーク事件 waitは通常だと終了しない処理 (今回は無限ループでスリープ) wait2は比較的短い処理なので通 常ならばwait2の方が先に終了する
スレッドリーク事件 wait2が終わる task内のループが再び実行 waitが呼び出されスレッドが 作られる wait2が終わり再びループへ
スレッドリーク事件 よく見ると無限ループ内にawaitがない つまりcancelしたくてもそもそも中断が できない状態 呼び出されるたびに 中断できないスレッドが溜まっていく
教訓 • 非同期プログラミングではRustコンパイラでも保証しきれない性質がたくさんある • ドキュメントをきちんと読んで非同期プログラミングの仕組みを理解しよう • テスト・監視など他のプログラミング言語でも有用な当たり前のことをしましょう