Котлин сопрограммы 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. Этот локальный блок не выйдет, пока живы сопрограммы в нем.