一架梯子,一头程序猿,仰望星空!
Golang高级特性面试题 > 内容正文

Go 中哪些动作会触发 runtime 调度?


问题简答

通常来讲,当协程在进行IO等待、sleep、等待锁、等待通道或者手动触发 runtime.Gosched 都会触发协程调度器进行调度工作。

问题详解:

下面是触发协程调度器进行调度工作的场景:

第一种:系统调用 SysCall
当你在 goroutine 进行一些 sleep 休眠、读取磁盘或者发送网络请求时,其实都会发生系统调用,进入操作系统内核。

而一旦发生系统调用,就会直接触发 runtime 的调度,当前的 P 就会去找其他的 M 进行绑定,并取出 G 开始运行。

第二种:等待锁、通道
此外,在你的代码中,若因为锁或者通道导致代码阻塞了,也会触发调度。

第三种:人工触发
在代码中直接调用 runtime.Gosched 方法,也可以手动触发。