Котлин сопрограммы GlobalScope.launch vs runBlocking - PullRequest
0 голосов
/ 23 февраля 2019

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

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

1 Ответ

0 голосов
/ 24 февраля 2019

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 нет.

...