web-dev-qa-db-ja.com

Kotlin:コルーチンスコープとコルーチンコンテキスト

誰もがそれらの違いを説明できますか?スコープはそれらをキャンセルするための参照(例:Job)を提供し、コンテキストは基になるスレッドへの参照を提供すると思います。そうですか?

14
Jose

スコープ

すべてのコルーチンビルダー(launch、asyncなど)とすべてのスコープ関数(coroutineScope、withContextなど)は、実行するコードの内部ブロックに独自のJobインスタンスを持つ独自のスコープを提供します。慣例により、それらはすべて、ブロック内のすべてのコルーチンが完了するのを待ってから、自分自身を完了するため、構造化された同時実行の規則が適用されます。

ソース

コンテキスト

コルーチンは常に、Kotlin標準ライブラリで定義されているCoroutineContextタイプの値で表されるコンテキストで実行されます。

コルーチンコンテキストは、さまざまな要素のセットです。主な要素は、前に見たコルーチンのジョブと、このセクションで説明するそのディスパッチャーです。

ソース

1
Willi Mentzel

はい、原則としてあなたは正しいです、ここに詳細を示します。

スコープ

  • コルーチンはスコープ内で実行する必要があります
  • それはその中で実行されるすべてのコルーチンを追跡する方法です
  • すべての( cooperative )コルーチンはスコープを介してキャンセルできます
  • スコープはキャッチされない例外を取得します
  • これらは、コルーチンをアプリケーション固有のライフサイクル(例:Androidでは viewModelScope )にバインドしてリークを回避する方法です

コンテキスト

コンテキストは、コルーチンを実行するスレッドを決定します。 4つのオプションがあります。

  • Dispatchers.Default-CPUを集中的に使用する場合(大きなリストの並べ替えなど)
  • Dispatchers.Main-これが何になるかは、プログラムの実行時の依存関係に追加した内容によって異なります(例 kotlinx-coroutines-Android 、AndroidのUIスレッド用)
  • Dispatchers.Unconfined-特定のスレッドで制限なしにコルーチンを実行します
  • Dispatchers.IO-重いIOの作業(長時間実行のデータベースクエリなど)の場合)

次の例では、スコープとコンテキストの両方をまとめています。 IO work)に指定されたスレッドでコルーチンが実行される(変更されていない場合)新しいスコープを作成し、それらのスコープを介してそれらをキャンセルします。

val scope = CoroutineScope(context = Dispatchers.IO) 
val job = scope.launch {
    val result = suspendFunc1()
    suspendFunc2(result)
}
// ...
scope.cancel() // suspendFunc1() and suspendFunc2() will be cancelled
1
Willi Mentzel