coroutineScope vs supervisorScope
总结并不完全,只列出一些主要异同。
同
1 内部子协程及作用域本身都完成了函数才完成
This function returns as soon as the given block and all its child coroutines are completed.
2 都不参与函数调用处所在的scope的结构化并发
在函数调用处 re-throw exception。
异
主要体现在异常情况下的 parent-child 取消逻辑。
coroutineScope是双向的取消
1
子协程发生异常 -> coroutineScope作用域整个取消 -> 其他子协程也被取消
2
coroutineScope取消/作用域本身异常 -> 取消内部所有子协程
supervisorScope是单向的取消
1
supervisorScope取消/作用域本身异常 -> 取消内部所有子协程。
但是内部的子协程异常不会导致supervisorScope作用域的取消。需要像顶层协程那样给子协程设置Handler为他们设置独立的错误处理器,不设置的话没有处理就会打印异常信息。
可以从博客中另外一篇《协程异常处理总结》了解更多。
评论