🧉

Coroutinesを理解したい①

2023/12/02に公開

Overview

公式より引用

Kotlin は、他のライブラリがコルーチンを利用できるようにするために、標準ライブラリで最小限の低レベル API のみを提供します。 同様の機能を持つ他の多くの言語とは異なり、async と await は Kotlin のキーワードではなく、標準ライブラリの一部でもありません。 さらに、Kotlin のサスペンド関数の概念は、Future や Promise よりも安全でエラーが発生しにくい非同期操作の抽象化を提供します。

kotlinx.coroutines は、JetBrains によって開発されたコルーチン用の豊富なライブラリです。 これには、起動、非同期など、このガイドで説明する高レベルのコルーチン対応プリミティブが多数含まれています。

これは、kotlinx.coroutines のコア機能に関するガイドであり、さまざまなトピックに分かれた一連の例が示されています。

このガイドの例に従うだけでなくコルーチンを使用するには、プロジェクトの README で説明されているように、kotlinx-coroutines-core モジュールへの依存関係を追加する必要があります。


パッケージが必要なので追加しましょう。私は古いのを入れてしまった💦

バージョンが確認できるサイト
https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core

Github
https://github.com/Kotlin/kotlinx.coroutines

プロジェクトはこちらの通りにやればOK
https://pleiades.io/help/idea/create-your-first-kotlin-app.html

プロジェクトを作ったら、Coroutineなるものは入っていないのパッケージとして追加する必要あります。

最新版が良いと思う。

dependencies {
    testImplementation(kotlin("test"))
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2")
}

summary

コルーチンの基本
https://kotlinlang.org/docs/coroutines-basics.html

コルーチンは、中断可能な計算のインスタンスです。 これは、コードの残りの部分と同時に動作するコード ブロックを実行する必要があるという意味で、概念的にはスレッドに似ています。 ただし、コルーチンは特定のスレッドにバインドされません。 あるスレッドで実行を一時停止し、別のスレッドで再開する場合があります。

コルーチンは軽量のスレッドと考えることができますが、実際の使用法がスレッドとは大きく異なる重要な違いが多数あります。

次のコードを実行して、最初に動作するコルーチンを取得します。

import kotlinx.coroutines.*

fun main() = runBlocking { // これは、コルーチンスコープ
    launch { // 新しいコルーチンを起動して続行します
        delay(1000L) // 1 秒間のノンブロッキング遅延 (デフォルトの時間単位はミリ秒)
        println("World!") // 遅延後に出力する
    }
    println("Hello") // メインコルーチンは継続しますが、前のコルーチンは遅延します
}

launch はコルーチンビルダーです。 コードの残りの部分と同時に新しいコルーチンが起動され、独立して動作し続けます。 そのため、Hello が最初に印刷されます。

遅延は特別な一時停止機能です。 コルーチンを特定の時間一時停止します。 コルーチンを一時停止しても、基礎となるスレッドはブロックされませんが、他のコルーチンが実行され、基礎となるスレッドをコードに使用できるようになります。

runBlocking は、通常の楽しい main() の非コルーチン世界と、runBlocking { ... } 中括弧内のコルーチンを含むコードとの橋渡しをするコルーチン ビルダーでもあります。 これは、IDE では runBlocking 開始中括弧の直後の CoroutineScope ヒントによって強調表示されます。

このコードで runBlocking を削除するか忘れると、起動は CoroutineScope でのみ宣言されるため、起動呼び出しでエラーが発生します。

runBlocking という名前は、runBlocking { ... } 内のすべてのコルーチンが実行を完了するまで、それを実行するスレッド (この場合はメイン スレッド) が呼び出し中にブロックされることを意味します。 runBlocking がアプリケーションの最上位レベルでこのように使用されているのをよく見かけますが、スレッドは高価なリソースであり、スレッドをブロックすることは非効率的であり、望ましくないことが多いため、実際のコード内で使用されることは非常にまれです。

構造化された同時実行
コルーチンは構造化された同時実行の原則に従います。これは、新しいコルーチンは、コルーチンの有効期間を区切る特定の CoroutineScope 内でのみ起動できることを意味します。 上の例は、runBlocking が対応するスコープを確立することを示しています。そのため、前の例は World! まで待機します。 は 1 秒遅れて出力され、その後終了します。

実際のアプリケーションでは、多数のコルーチンを起動することになります。 構造化された同時実行により、それらが失われず、漏洩しないことが保証されます。 外側のスコープは、そのすべての子コルーチンが完了するまで完了できません。 構造化された同時実行性により、コード内のエラーが適切に報告され、決して失われることがなくなります。

thoughts

今回作成したプログラムは、コルーチンスコープの中のコードは、1秒間遅延させてログに表示する処理をおこない、コルーチンスコープの外のコードは、先にログを出す通常通り実行されるコードでした。

単純なコードでしたが、知識がないものでなんだろうと頭が混乱しておりました。非同期処理をしてくれる仕組みってことでした。

GoogleのAIがわかりやすく教えてくれました!

Kotlin コルーチンは、アプリで同時に処理を行うために使用されます。コルーチンを使用すると、コードブロックの実行を中断して後で再開できるため、その間に他の処理を行うことができます。

コルーチンを使用すると、次のことが可能になります。

  • 非同期コードを記述しやすくなる
  • リソースを効果的に使用できる
  • アプリケーションのレスポンスを向上させることができる
  • メインスレッドをブロックしてアプリの応答を止める可能性のある長時間実行タスクを管理できる
  • ViewModel がアクティブな場合にのみ行う必要がある作業を行うことができる

コルーチンは、Kotlin にはバージョン 1.3 で追加されました。

日本語版の公式の解説もあるみたいです!
https://developer.android.com/kotlin/coroutines-adv?hl=ja

Discussion