下面是触发协程调度器进行调度工作的场景:
第一种:系统调用 SysCall
当你在 goroutine 进行一些 sleep 休眠、读取磁盘或者发送网络请求时,其实都会发生系统调用,进入操作系统内核。
而一旦发生系统调用,就会直接触发 runtime 的调度,当前的 P 就会去找其他的 M 进行绑定,并取出 G 开始运行。
第二种:等待锁、通道
此外,在你的代码中,若因为锁或者通道导致代码阻塞了,也会触发调度。
第三种:人工触发
在代码中直接调用 runtime.Gosched 方法,也可以手动触发。