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
, чтобы просто убить дочерние сопрограммы и не ждать завершения отмены?