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
suspending functionの裏側
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Keita Kagurazaka
November 09, 2017
Programming
480
3
Share
suspending functionの裏側
第07回Kotlin勉強会@Sansanでの発表資料です。
Keita Kagurazaka
November 09, 2017
More Decks by Keita Kagurazaka
See All by Keita Kagurazaka
三者三様 宣言的UI
kkagurazaka
0
520
SELECT FOR UPDATEの話
kkagurazaka
0
480
Mobileアプリのアーキテクチャ設計法
kkagurazaka
2
1.5k
原理から完全理解するDagger Hilt Migration
kkagurazaka
1
2k
今後のJetpackでAndroid開発はこう変わる!
kkagurazaka
16
6.4k
外部SDKのViewにマスク処理をする方法と罠
kkagurazaka
0
1.1k
AWAのフルリニューアルを支えたアーキテクチャ
kkagurazaka
1
970
CQRS Architecture on Android
kkagurazaka
7
3.2k
coroutinesで非同期ページネーション
kkagurazaka
1
710
Other Decks in Programming
See All in Programming
SPMマルチモジュールで テストカバレッジを取得する技法
yosshi4486
0
130
tsserverとは何だったのか、これからどうなるのか
nowaki28
1
420
分析エージェント精度向上における データアナリストの役割
oura_shoya
0
140
AI時代だからこそ「Bloc」を採用する価値があるのかもしれない
takuroabe
0
260
OSもどきOS
arkw
0
280
TypeScriptだけでAIエージェントを作る フロント・エージェント・インフラのフルスタック実践
har1101
6
1.2k
プロパティの順序で型推論が壊れる!? TypeScript6.0の修正からContext-Sensitivityの仕組みを追う
bicstone
2
1.2k
OCRを使ってゲームのアイテムをデータ化する
kishikawakatsumi
0
120
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
100
Talking to terminals (and how they talk back) (KotlinConf 2026)
jakewharton
PRO
1
160
JavaDoc 再入門
nagise
0
210
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
140
Featured
See All Featured
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
250
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
340
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
130
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
180
Transcript
suspending functionの裏側 2017/11/9 第7回Kotlin勉強会@Sansan @kkagurazaka
皆さん、coroutines使ってますか?
KotlinConf Keynote Recap
KotlinConf Keynote Recap
None
coroutines じゃんじゃん使っていきましょう
そんなcoroutinesが どうやって実現されているか その裏側をお話します
自己紹介 • Keita Kagurazaka • Android App Developer • Sansan株式会社
2017/4〜 • Kotlin / CQRS / DDD / Splatoon / Github: @k-kagurazaka Twitter: @kkagurazaka
coroutinesとは • 中断・再開可能な計算のインスタンス ◦ Threadクラスのように、作成して実行する launch(UI) { val token =
fetchToken() // Tokenが取得できるまで実行を中断 val item = postItem(token, newItem) // 投稿が完了するまで実行を中断 updateUI(item) }
どのように中断・再開を 実現しているのか?
suspending function
suspending function • 呼び出されるとcoroutinesを中断する(こともできる) • suspending functionはcoroutinesかsuspending functionか らしか呼び出せない •
Java byte codeになる際にCPS transformされる
suspending function • 呼び出されるとcoroutinesを中断する(こともできる) • suspending functionはcoroutinesかsuspending functionか らしか呼び出せない •
Java byte codeになる際にCPS transformされる
Continuation Passing Style (CPS) 戻り値で値を返すのではなく、引数のContinuationインスタンスに 結果を渡すことで値を伝達するスタイル interface Continuation<in T> {
// 成功したことと、その結果を伝達 fun resume(value: T): Unit //失敗したことと、原因の例外を伝達 fun resumeWithException(exception: Throwable): Unit }
CPS transform // Kotlinでの宣言 suspend fun fetchToken(): Token // 変換後のJava
byte codeをKotlinっぽく書いたもの fun fetchToken(continuation: Continuation<Token>): Any? • 中断する場合は COROUTINE_SUSPENDED 定数を返し、 再開するときにContinuationをresumeする • 中断しない場合は結果の T を返す
CPS transform後のイメージ launch(UI) { fetchToken(object : Continuation<Token> { override fun
resume(value: Token) { postItem(value, newItem, object: Continuation<Item> { override fun resume(value: Item) { updateUI(value) } }) } }) } suspending functionの呼び出し以降がContinuationを介した コールバックに変換される
内部的な実装とはいえ コールバックのネストが 深すぎないか?
ステートマシンによる実装 class StateMachine implements Continuation<Object> { int label = 0;
// ステートマシンの状態 Token token; // suspending functionのローカル変数 Item item; // 同上 void resume(Object data) { … } }
void resume(Object data) { switch(label) { case 0: label =
1; data = fetchToken(this); // CPS変換後なのでContinuation=thisを渡す if (data == COROUTINE_SUSPENDED) break; // 中断が発生した場合は抜ける case 1: token = (Token)data; label = 2; data = postItem(token, newItem, this); if (data == COROUTINE_SUSPENDED) break; case 2: item = (Item)data; updateUI(item) label = -1; // ステートマシンの終了 break; } }
内部実装がコールバックヘル というわけではない!
まとめ • coroutineの中断はsuspending functionで発生する • suspending functionはCPS transformによってコールバック に変換される •
複数のsuspending functionの呼び出しはステートマシンにコ ンパイルされる
Thanks!