在 Go 中,有一些操作会触发 runtime 调度,包括:
下面是一个示例代码,演示了阻塞操作和手动调用 runtime.Gosched() 函数会触发调度器的运行:
package main
import (
"fmt"
"time"
)
func main() {
go func() {
for i := 0; i < 10; i++ {
fmt.Println("goroutine 1:", i)
time.Sleep(100 * time.Millisecond) // 阻塞操作
}
}()
go func() {
for i := 0; i < 10; i++ {
fmt.Println("goroutine 2:", i)
time.Sleep(100 * time.Millisecond) // 阻塞操作
}
}()
for i := 0; i < 10; i++ {
fmt.Println("main goroutine:", i)
if i == 5 {
runtime.Gosched() // 手动触发调度器运行
}
}
}
在这个示例代码中,我们启动了两个 goroutine,每个 goroutine 都会执行一段循环并进行阻塞操作。同时,主 goroutine 也会执行一段循环,并在第 5 次迭代时手动调用 runtime.Gosched() 函数。
由于每个 goroutine 的循环都进行了阻塞操作,所以它们会在运行一段时间后自动让出 CPU 给其他 goroutine 使用。
另外,当主 goroutine 调用了 runtime.Gosched() 函数时,它也会主动让出 CPU 给其他 goroutine 使用。这些操作都会触发调度器的运行,让所有 goroutine 在执行过程中公平地分享 CPU 时间。