首先,go 协程里面起的协程和所在的协程没有任何关系,他们没有层级关系,完全独立。go xxx() 成功就会创建生成的协程放在调度队列里等待调度。大概率是本M调度的,但也有可能被窃取 。
其次,题主说的外部崩溃要明确一下,如果是panic的情况(默认又没有recover)那进程都直接挂了,就不存在还要通知到其他协程的问题。
如果进程没有挂,题主这里本质需要的就是两个 goroutine 消息的传递,通常一般都是使用标准库 context 来通知有层级关系的 goroutine。当然还可以使用全局变量,共享的结构体都行,本质只要能让对方感知到的一种方式。
最后一点,如果要确保 panic 之后还要确保执行一些逻辑,比如设置某个变量,通知某个消息,那么就一定要放在 defer 里面,确保安全执行。
关于 defer 我之前梳理了详细的内部实现,可以参考下:
以上,简要的回答,可能没有特别完善,只是个思路。