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
会否有任何解决办法,比如说杀死子协程而不等待取消完成?