Котлин: сфера действия сопрограмм против контекста сопрограмм - PullRequest
0 голосов
/ 29 января 2019

Кто-нибудь может объяснить разницу между ними?Я думаю, что видимость предоставляет ссылку (например, Job), чтобы отменить их, а контекст предоставляет ссылку на основной поток.Это так?

Ответы [ 3 ]

0 голосов
/ 29 января 2019

CoroutineScope имеет-а CoroutineContext.

Например, если у вас есть:

runBlocking { // defines coroutineScope

    launch(Dispatchers.Default) { //inherits coroutineScope but changes context

    }
}

runBlocking определяет CoroutineScope (узнайте об этом здесь ), который launch наследует.Контекст переопределяется путем явного указания диспетчера здесь.Если вы посмотрите на определение launch, вы увидите, что для него требуется необязательный CoroutineContext:

public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    ...
)

Другой частью контекста будет имя сопрограммы:

launch(CoroutineName("launchMe") + Dispatchers.Default) {
    println("")
}
0 голосов
/ 29 января 2019

Они действительно тесно связаны.Вы могли бы сказать, что CoroutineScope формализует способ наследования CoroutineContext.

CoroutineScope не имеет данных сам по себе, он просто содержит CoroutineContext.Его ключевая роль заключается в том, что он является неявным получателем блока, который вы передаете launch, async и т. Д.

См. Этот пример:

runBlocking {
    val scope0 = this
    // scope0 is the top-level coroutine scope.
    scope0.launch {
        val scope1 = this
        // scope1 inherits its context from scope0. It replaces the Job field
        // with its own job, which is a child of the job in scope0.
        // It retains the Dispatcher field so the launched coroutine uses
        // the dispatcher created by runBlocking.
        scope1.launch {
            val scope2 = this
            // scope2 inherits from scope1
        }
    }
}

Вы можете увидеть, как CoroutineScopeопосредует наследование сопрограммных контекстов.Если вы отмените задание в scope1, это будет распространяться на scope2 и отменяет также и задание launch ed.

Обратите внимание на ключевую синтаксическую особенность: я явно написал scope0.launch, но имелЯ написал только launch, это будет означать точно то же самое.Вот как CoroutineScope помогает «автоматически» распространять область видимости.

0 голосов
/ 29 января 2019

Область действия

Каждый компилятор сопрограмм (например, запуск, асинхронизация и т. Д.) И каждая функция определения объема (например, coroutineScope, withContext и т. Д.) Предоставляют свою собственную область с собственным заданиемэкземпляр во внутренний блок кода, который он запускает.По соглашению, они все ждут завершения всех сопрограмм в своем блоке, прежде чем завершить себя, что обеспечивает соблюдение дисциплины структурированного параллелизма.

Источник

Context

Сопрограммы всегда выполняются в некотором контексте, который представлен значением типа CoroutineContext, определенного в стандартной библиотеке Kotlin.

Контекст сопрограммы представляет собой наборразличных элементов.Основными элементами являются Работа сопрограммы, которую мы видели ранее, и ее диспетчер, который рассматривается в этом разделе.

Источник

...