コルーチンスコープとその管理

Kotlinの並行処理における**コルーチンスコープ(Coroutine Scope)**は、コルーチンのライフサイクルを管理するための重要な概念です。コルーチンスコープを理解することにより、安全かつ効率的に非同期処理を制御できます。


コルーチンスコープとは何か?

コルーチンスコープ(CoroutineScope)とは、コルーチンの実行コンテキストとジョブの階層構造を束ねる枠組みです。具体的には、次の2つを内包しています:

  1. CoroutineContext(コルーチンコンテキスト)
    ディスパッチャー(例:Dispatchers.IO)や例外ハンドラ、Jobなどの情報を含みます。

  2. Job
    コルーチンのキャンセルや親子関係の追跡に使われます。

コルーチンはスコープ内で起動され、そのスコープがキャンセルされると、スコープに属するすべてのコルーチンもキャンセルされます。


なぜコルーチンスコープが必要か?

コルーチンのスコープを明示的に管理することで、以下のようなメリットがあります:

  • ライフサイクルに応じたコルーチンの管理(例えば、AndroidのActivityViewModelが破棄されたらコルーチンも自動停止)

  • 親子関係に基づく一括キャンセルの実現

  • 例外の伝播管理


主なコルーチンスコープの種類と使用例

1. GlobalScope

  • アプリケーション全体のスコープで、ライフサイクル管理はされません。

  • 一時的なテストや単純な処理には使えますが、実運用では非推奨。

kotlin
GlobalScope.launch { // 永続的なコルーチン。アプリ終了まで走る可能性がある }

2. CoroutineScope(任意に定義)

  • 任意のスコープを作成し、特定のジョブやコンテキストで管理したいときに使用。

kotlin
val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) scope.launch { // このスコープに従属するコルーチン }

3. 構造化並行性とcoroutineScope関数

  • suspend関数内で子コルーチンを安全に生成し、親関数が完了するまで待機します。

kotlin
suspend fun fetchData() = coroutineScope { val deferred = async { getRemoteData() } val result = deferred.await() }

4. Androidにおける特別なスコープ

  • lifecycleScopeActivityFragment用)

  • viewModelScopeViewModel用)

kotlin
viewModelScope.launch { // ViewModelが破棄されると自動キャンセル }

スコープのキャンセルと管理

CoroutineScopeのスコープをキャンセルするには、Job.cancel()を使用します。

kotlin
val job = Job() val scope = CoroutineScope(Dispatchers.Default + job) scope.launch { // 長時間の処理 } job.cancel() // 起動したすべてのコルーチンがキャンセルされる

スコープのカスタム化

CoroutineScopeはインターフェースなので、クラスに継承させて自分でカスタムスコープを持たせることも可能です。

kotlin
class MyScopedClass : CoroutineScope { private val job = Job() override val coroutineContext: CoroutineContext get() = Dispatchers.Main + job fun destroy() { job.cancel() } }

まとめ

項目 説明
CoroutineScope コルーチンの実行と管理単位
CoroutineContext Dispatcher、Job、ExceptionHandlerなどを含む
構造化並行性 子コルーチンの完了まで親が待機する仕組み
GlobalScope アプリ全体に属するスコープ(非推奨)
coroutineScope関数 suspend関数内で一時的に安全なスコープを作る
viewModelScope, lifecycleScope Androidのライフサイクルに基づいたスコープ

生成日:2025/05/04