Объем сопрограмм может оставаться запущенным после исключения - PullRequest
0 голосов
/ 04 июня 2019
suspend fun processReferences(refs: List<Reference>) =
    coroutineScope{
        for(ref in refs){
            val location = ref.resolveLocation()
            launch{
                val content = downloadContent(location)
                processContent(ref, content)
            }
        }
    }

в приведенном выше коде (из Kotlin Conference 2018), если мы получим исключение из одной из запущенных сопрограмм, все дочерние сопрограммы будут отменены, а coroutineScope не вернет или выбросит исключение, пока все дочерние сопрограммы не будут завершены. Но отмена совместная, и если downloadContent не проверять отмену, она будет работать до конца, и это пустая трата времени и ресурсов (coroutineScope придется ждать завершения всех downloadContent, поскольку они не проверяют отмену) .

Но по-старому, если мы используем поток вместо сопрограмм, это всего лишь пустая трата ресурсов, и вскоре будет распространяться исключение, и это не будет тратить время!

Будет ли какое-либо решение для coroutineScope, чтобы просто убить дочерние сопрограммы и не ждать завершения отмены?

...