なのログ

だから見てて下さい・・・俺の・・・変身

memo : Kotlin Coroutines (basics)

Kotlinのコルーチンのはなし。
基本のチュートリアルをやりました。わからんことのメモとかそういうの。


もくじ:

やったやつ:Coroutines basics
コード:githubにチュートリアルの内容が並んでるだけ
ていうか:このMain.ktだけでいいです

わからんやつ:Scope Builder

fun main() = runBlocking { // this: CoroutineScope
    launch { 
        delay(200L)
        println("02 Task from runBlocking")
    }
    
    coroutineScope { // Creates a coroutine scope
        launch {
            delay(500L) 
            println("03 Task from nested launch")
        }
    
        delay(100L)
        println("01 Task from coroutine scope") // This line will be printed before the nested launch
    }
    
    println("04 Coroutine scope is over") // This line is not printed until the nested launch completes
}

見た目だと04 -> 01 -> 03 -> 02って動きそう
試したかんじ、coroutineScopeで起動すると待つらしい(←ここが謎ポイント)
書いてておもったけど、もしかしたら「そういうもんやで」かもしれない
コルーチン範囲を生成するためのもの(内側でノンブロッキングなことをするため)というだけで、
なんかそもそもcoroutineScopeはブロッキングな存在なのかもしれない

とかいうけど、

(coroutineScopeを指して) does not block the current thread while waiting for all children to complete.

って書いてあるのでやっぱ謎。待ってるやん。
・・・お?(気付き)
「待つけどブロックしないよ」の意????スレッドを????
なんかスレッドが全く別のことをする場合に意味がある的な????????
なるほど?
「待つ」と「ブロックする」は別・・・え・・・すご・・・。
シチュエーションがちゃんとわかってない気がするし、今の流れの処理だけは止めるという都合の良さに天才を感じるけど、たぶん納得だ。
というか「今の流れの処理だけは止める」の、まさしくコルーチンの機能なところがある。納得しよう。

わからんやつ2:global coroutines are like daemon threads

GlobalScope.launch {
    repeat(1000) { i ->
            println("I'm sleeping $i ...")
        delay(500L)
    }
}
delay(1300L) // just quit after delay

これはたぶん「そういうもん」なんだけれど、なんだかグローバルスコープのコルーチンはメインの動きが終わったら一緒に終わるらしい。


というかんじで「基本」のコーナーが完。
この後のは、困り次第調べて使っていくかんじのつもり。
ここまでの内容でたぶん使い始められるでしょう。(楽観)
というか困り次第調べる先がこの続きなんでしょうね。そうなるな。

あとはこのあたりを見てました。並列でwaitするの神。
speakerdeck.com