1、父子ctx
子ctx cancel 不会取消父ctx。
父ctx cancel 会取消子ctx。
兄弟ctx cancel 不会取消兄弟ctx。
2、父子协程
panic
子协程panic,会逐级往上panic直到主线程。
所以在实际生产中,在go出去的函数“b()”内部一定要加上recover。
例子:
package main
import "time"
func main() {
a()
}
func a() {
defer func() { // 注意在此处并不会捕获b()中的panic
if r := recover(); r != nil {
println("789")
}
}()
go b()
time.Sleep(10 * time.Second)
println("456")
}
func b() {
panic(any("123"))
}
输出:
panic: 123
goroutine 18 [running]:
main.b()
/Users/fengyingwang/go/src/test/main.go:23 +0x27
created by main.a
/Users/fengyingwang/go/src/test/main.go:16 +0x46
Process finished with exit code 2
退出
互相无影响。