Функция coroutineScope

Функция coroutineScope создает новую область видимости для корутин, наследуя контекст от родительской корутины. Является suspend-функцией и приостанавливает выполнение до тех пор, пока не завершатся все дочерние корутины внутри блока. Если какая-либо дочерняя корутина завершается с ошибкой, то все остальные дочерние корутины отменяются, а исключение пробрасывается наружу.

Импорт

kotlinimport kotlinx.coroutines.coroutineScope

Синтаксис

kotlinsuspend fun <R> coroutineScope(
  block: suspend CoroutineScope.() -> R
): R

Пример

Базовое использование coroutineScope для запуска дочерних корутин:

kotlinimport kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking

fun main() = runBlocking {
  coroutineScope {
    launch {
      delay(1000)
      println("Child coroutine 1")
    }
    launch {
      delay(500)
      println("Child coroutine 2")
    }
    println("Parent coroutine")
  }
  println("All coroutines completed")
}

Результат выполнения кода:

kotlinParent coroutine
Child coroutine 2
Child coroutine 1
All coroutines completed

Пример

Возврат значения из coroutineScope:

kotlinimport kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking

fun main() = runBlocking {
  val result = coroutineScope {
    delay(1000)
    "Result from coroutine scope"
  }
  println("Result: $result")
}

Результат выполнения кода:

kotlinResult: Result from coroutine scope

Пример

Обработка исключений в coroutineScope:

kotlinimport kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking

fun main() = runBlocking {
  try {
    coroutineScope {
      launch {
        delay(500)
        throw RuntimeException("Error in child coroutine")
      }
      launch {
        delay(1000)
        println("This won't be printed")
      }
    }
  } catch (e: Exception) {
    println("Caught exception: ${e.message}")
  }
}

Результат выполнения кода:

kotlinCaught exception: Error in child coroutine

Пример

Параллельное выполнение операций в coroutineScope:

kotlinimport kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking

fun main() = runBlocking {
  val result = coroutineScope {
    val deferred1 = async {
      delay(1000)
      "Hello"
    }
    val deferred2 = async {
      delay(500)
      "World"
    }
    "${deferred1.await()} ${deferred2.await()}"
  }
  println(result)
}

Результат выполнения кода:

kotlinHello World

Смотрите также

  • функцию withContext,
    которая переключает контекст выполнения корутины
  • функцию runBlocking,
    которая создает блокирующий контекст для корутин
  • функцию async,
    которая запускает асинхронную операцию с возвратом результата