2.12 Go 中哪些动作会触发 runtime 调度?¶
goroutine 在遇到哪些情况会触发 runtime 的调度器去调度呢?
第一种:系统调用 SysCall
当你在 goroutine 进行一些 sleep 休眠、读取磁盘或者发送网络请求时,其实都会发生系统调用,进入操作系统内核。
而一旦发生系统调用,就会直接触发 runtime 的调度,当前的 P 就会去找其他的 M 进行绑定,并取出 G 开始运行。
第二种:等待锁、通道
此外,在你的代码中,若因为锁或者通道导致代码阻塞了,也会触发调度。
第三种:人工触发
在代码中直接调用 runtime.Gosched 方法,也可以手动触发。
另外说一个小知识,当你执行 fmt.Println 的时候,也会触发调度,这是为什么呢?留给你自己思考咯