总结并不完全,只列出一些主要异同。

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为他们设置独立的错误处理器,不设置的话没有处理就会打印异常信息。

可以从博客中另外一篇《协程异常处理总结》了解更多。