Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
suspending functionの裏側
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Keita Kagurazaka
November 09, 2017
Programming
490
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
suspending functionの裏側
第07回Kotlin勉強会@Sansanでの発表資料です。
Keita Kagurazaka
November 09, 2017
More Decks by Keita Kagurazaka
See All by Keita Kagurazaka
三者三様 宣言的UI
kkagurazaka
0
620
SELECT FOR UPDATEの話
kkagurazaka
0
550
Mobileアプリのアーキテクチャ設計法
kkagurazaka
2
1.5k
原理から完全理解するDagger Hilt Migration
kkagurazaka
1
2k
今後のJetpackでAndroid開発はこう変わる!
kkagurazaka
16
6.5k
外部SDKのViewにマスク処理をする方法と罠
kkagurazaka
0
1.1k
AWAのフルリニューアルを支えたアーキテクチャ
kkagurazaka
1
990
CQRS Architecture on Android
kkagurazaka
7
3.3k
coroutinesで非同期ページネーション
kkagurazaka
1
730
Other Decks in Programming
See All in Programming
ActionController meets Protocol Buffers
sorah
1
770
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
6.3k
Next.js: The final boss of Web Performance
guaca
0
380
[DroidKnights 2026] Workflow AX: From Auto-Documented Policies to E2E Testing
raeminkang
0
480
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
2.1k
Vue.jsで作る空間解析アプリとCapacitorプラグインのData Bridge
hal_spidernight
1
160
ChromeでローカルLLM
ryu1013
0
190
sbt 2.0: takeoff
eed3si9n
0
190
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
600
オーケストレーション記述言語 Katari
yukikurage
0
220
プロジェクトコードをキレイキレイしよう!暗黙的な参照を読み解く静的解析
ostk0069
0
200
AIがコードを書いてくれる時代、我々は何を確かめるのか
yosuke_furukawa
PRO
13
5.6k
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
790
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
470
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
121
120k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
430
Mobile First: as difficult as doing things right
swwweet
225
10k
Designing for Performance
lara
612
70k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
450
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.6k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
Building Adaptive Systems
keathley
44
3.3k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
880
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!