supervisorScope отменяет своего родителя - PullRequest
0 голосов
/ 04 апреля 2020

Я играл с supervisorScope в android. В документации сказано следующее:

Сбой дочернего элемента не приводит к сбою этой области и не влияет на другие дочерние элементы, поэтому можно реализовать настраиваемую политику для обработки сбоев своих дочерних элементов. Смотрите SupervisorJob для деталей. Сбой самой области (исключение, выброшенное в блоке или отмена) приводит к ошибке области со всеми ее дочерними элементами, но не отменяет родительское задание.

Но рассмотрим следующий код

viewModelScope.launch {

       launch { someLongJob() }

       supervisorScope {
            launch { jobTwo() }
            launch { jobThree() }
            delay(500)
            throw ArithmeticException()
       }

}

private suspend fun someLongJob() {
    try {
        delay(Long.MAX_VALUE)
    } catch (e: Exception) {
        Log.d(TAG, "Long job cancelled")
    }
}

private suspend fun jobOne() {
    delay(1000)
    throw ArithmeticException()
}

private suspend fun jobTwo() {
    try {
        delay(2000)
    } catch (e: Exception) {
        Log.d(TAG, "Job 2 cancelled")
        throw e
    }
    Log.d(TAG, "Job 2 completed successfully")
}

private suspend fun jobThree() {
    try {
        delay(3000)
    } catch (e: Exception) {
        Log.d(TAG, "Job 3 cancelled")
        throw e
    }
    Log.d(TAG, "Job 3 completed successfully")
}

Создает следующий вывод

D / TEST: задание 2 отменено

D / TEST: задание 3 отменено

D / TEST: долгое задание отменено

--- начало cra sh

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

1 Ответ

1 голос
/ 04 апреля 2020

supervisorScope - это вызов функции, как и любой другой. В вашем случае это завершилось внезапно, за исключением. Поскольку вы его не перехватили, то же исключение вызвало внезапное завершение блока launch, а , что - его отмену. Затем, следуя основополагающим принципам структурированного параллелизма, отмена распространилась внутрь и отменила все дочерние задания.

...