Kotlinの並行処理における**コルーチンスコープ(Coroutine Scope)**は、コルーチンのライフサイクルを管理するための重要な概念です。コルーチンスコープを理解することにより、安全かつ効率的に非同期処理を制御できます。
コルーチンスコープとは何か?
コルーチンスコープ(CoroutineScope)とは、コルーチンの実行コンテキストとジョブの階層構造を束ねる枠組みです。具体的には、次の2つを内包しています:
-
CoroutineContext(コルーチンコンテキスト)
ディスパッチャー(例:Dispatchers.IO)や例外ハンドラ、Jobなどの情報を含みます。 -
Job
コルーチンのキャンセルや親子関係の追跡に使われます。
コルーチンはスコープ内で起動され、そのスコープがキャンセルされると、スコープに属するすべてのコルーチンもキャンセルされます。
なぜコルーチンスコープが必要か?
コルーチンのスコープを明示的に管理することで、以下のようなメリットがあります:
-
ライフサイクルに応じたコルーチンの管理(例えば、Androidの
ActivityやViewModelが破棄されたらコルーチンも自動停止) -
親子関係に基づく一括キャンセルの実現
-
例外の伝播管理
主なコルーチンスコープの種類と使用例
1. GlobalScope
GlobalScope-
アプリケーション全体のスコープで、ライフサイクル管理はされません。
-
一時的なテストや単純な処理には使えますが、実運用では非推奨。
2. CoroutineScope(任意に定義)
CoroutineScope(任意に定義)-
任意のスコープを作成し、特定のジョブやコンテキストで管理したいときに使用。
3. 構造化並行性とcoroutineScope関数
coroutineScope関数-
suspend関数内で子コルーチンを安全に生成し、親関数が完了するまで待機します。
4. Androidにおける特別なスコープ
-
lifecycleScope(ActivityやFragment用) -
viewModelScope(ViewModel用)
スコープのキャンセルと管理
CoroutineScopeのスコープをキャンセルするには、Job.cancel()を使用します。
スコープのカスタム化
CoroutineScopeはインターフェースなので、クラスに継承させて自分でカスタムスコープを持たせることも可能です。
まとめ
| 項目 | 説明 |
|---|---|
| CoroutineScope | コルーチンの実行と管理単位 |
| CoroutineContext | Dispatcher、Job、ExceptionHandlerなどを含む |
| 構造化並行性 | 子コルーチンの完了まで親が待機する仕組み |
GlobalScope |
アプリ全体に属するスコープ(非推奨) |
coroutineScope関数 |
suspend関数内で一時的に安全なスコープを作る |
viewModelScope, lifecycleScope |
Androidのライフサイクルに基づいたスコープ |
生成日:2025/05/04