Котлин сопрограммы GlobalScope.launch vs runBlocking

Есть ли разница между этими двумя подходами?

runBlocking {
   launch(coroutineDispatcher) {
      // job
   }
}
GlobalScope.launch(coroutineDispatcher) {
   // job
}

2 ответа

runBlocking запускает новую сопрограмму и прерывает текущий поток до его завершения. Эта функция не должна использоваться из сопрограммы. Он предназначен для связывания регулярного кода блокировки с библиотеками, написанными в стиле приостановки, для использования в основных функциях и в тестах.

// line 1
runBlocking {
   // line 2
   launch(coroutineDispatcher) {
      // line 3
   }
   // line 4
}
// line 5
someFunction()

В случае использования runBlocking Строки кода будут выполнены в следующем порядке:

line 1
line 2
line 4
line 3
line 5 // this line will be executed after coroutine is finished

Глобальная область используется для запуска сопрограмм верхнего уровня, которые работают в течение всего времени жизни приложения и не отменяются преждевременно. Другое использование глобальной области действия - операторы, работающие в Dispatchers.Unconfined, с которыми не связано никакое задание. Код приложения обычно должен использовать определяемый приложением CoroutineScope, поэтому использование асинхронного запуска или запуска в экземпляре GlobalScope крайне не рекомендуется.

// line 1
GlobalScope.launch(coroutineDispatcher) {
   // line 2
}
// line 3
someFunction()

В случае использования GlobalScope.launch Строки кода будут выполнены в следующем порядке:

line 1
line 3
line 2

таким образом runBlocking блокирует текущий поток до его завершения, GlobalScope.launch не делает.

Я попробую другое объяснение, не повторяя существующие стандартные ответы.

«Область сопрограммы» — это граница, в которой существует сопрограмма. «Глобальная область» существует, пока работает процесс приложения. Если вы используете «GlobalScope.launch()», вы создаете глобальную сопрограмму, которая находится в области приложения.

Если вы используете «runBlocking { launch() }», вы создаете сопрограмму, которая находится в локальном блоке сразу после runBlocking. Этот локальный блок не выйдет, пока живы сопрограммы в нем.

Другие вопросы по тегам