Skip to content

コルーチン

アプリケーションは、ユーザー入力への応答、データの読み込み、画面の更新など、複数のタスクを同時に実行する必要があることがよくあります。 これをサポートするために、アプリケーションは並行処理に依存します。これにより、操作は互いにブロックすることなく独立して実行できます。

タスクを並行して実行する最も一般的な方法はスレッドを使用することです。スレッドは、オペレーティングシステムによって管理される独立した実行パスです。 しかし、スレッドは比較的重く、多数作成するとパフォーマンス上の問題につながる可能性があります。

効率的な並行処理をサポートするために、Kotlinは_コルーチン_を中心に構築された非同期プログラミングを使用しています。コルーチンを使用すると、サスペンド関数を使って非同期コードを自然なシーケンシャルスタイルで記述できます。 コルーチンは、スレッドに代わる軽量な手段です。 これらはシステムリソースをブロックすることなくサスペンドでき、リソースに優しいため、細粒度の並行処理に適しています。

ほとんどのコルーチン機能は、kotlinx.coroutinesライブラリによって提供されています。 このライブラリには、コルーチンの起動、並行処理の管理、非同期ストリームの操作などを行うためのツールが含まれています。

Kotlinのコルーチンを初めて使用する場合は、より複雑なトピックに進む前に、コルーチンの基本ガイドから始めてください。 このガイドでは、サスペンド関数、コルーチンビルダー、構造化された並行処理の主要な概念を簡単な例を通して紹介します。

Get started with coroutines

コルーチンが実際にどのように使用されているかについては、KotlinConf アプリのサンプルプロジェクトを確認してください。

コルーチンの概念

kotlinx.coroutinesライブラリは、タスクを並行して実行し、コルーチン実行を構造化し、共有状態を管理するためのコアとなる構成要素を提供します。

サスペンド関数とコルーチンビルダー

Kotlinのコルーチンはサスペンド関数に基づいて構築されており、これによりコードはスレッドをブロックすることなく一時停止および再開できます。 suspendキーワードは、長時間実行される処理を非同期的に実行できる関数をマークします。

新しいコルーチンを起動するには、.launch().async()のようなコルーチンビルダーを使用します。 これらのビルダーは、CoroutineScopeの拡張関数であり、 コルーチンのライフサイクルを定義し、コルーチンコンテキストを提供します。

これらのビルダーの詳細については、コルーチンの基本サスペンド関数の組み合わせを参照してください。

コルーチンコンテキストと動作

CoroutineScopeからコルーチンを起動すると、その実行を制御するコンテキストが作成されます。 .launch().async()などのビルダー関数は、コルーチンがどのように動作するかを定義する一連の要素を自動的に作成します。

  • Jobインターフェースは、コルーチンのライフサイクルを追跡し、構造化された並行処理を可能にします。
  • CoroutineDispatcherは、コルーチンがどこで実行されるかを制御します。例えば、バックグラウンドスレッドやUIアプリケーションのメインスレッドなどです。
  • CoroutineExceptionHandlerは、キャッチされない例外を処理します。

これらは、その他の可能な要素とともに、コルーチンコンテキストを構成します。これはデフォルトでコルーチンの親から継承されます。 このコンテキストは、構造化された並行処理を可能にする階層を形成します。これにより、関連するコルーチンをまとめてキャンセルしたり、グループとして例外を処理したりできます。

非同期フローと共有可変状態

Kotlinは、コルーチンが通信するためのいくつかの方法を提供します。 コルーチン間で値を共有する方法に応じて、次のいずれかのオプションを使用します。

  • Flowは、コルーチンがアクティブに値を収集した場合にのみ値を生成します。
  • Channelは、複数のコルーチンが値を送受信できるようにし、各値は厳密に1つのコルーチンに配信されます。
  • SharedFlowは、すべてのアクティブな収集中のコルーチンとすべての値を継続的に共有します。

複数のコルーチンが同じデータにアクセスまたは更新する必要がある場合、それらは_可変状態を共有_します。 連携がなければ、予測不可能な方法で操作が互いに干渉する競合状態につながる可能性があります。 共有可変状態を安全に管理するには、StateFlowを使用して共有データをラップします。 その後、1つのコルーチンから更新し、他のコルーチンからその最新の値を収集できます。

詳細については、非同期フローチャネル、およびコルーチンとチャネルのチュートリアルを参照してください。

次のステップ