runtime.Gosched()
func TestRuntimeGoshched(t *testing.T) {
go func(s string) {
for i := 0; i < 2; i++ {
fmt.Println("协程:", s)
}
}("world")
// 主协程
for i := 0; i < 2; i++ {
fmt.Println("main:start")
// 切一下,再次分配任务 Gosched让出处理器,允许运行其他gor例程。它不会挂起当前的gor例程,因此会自动继续执行。
runtime.Gosched()
fmt.Println("main:hello")
}
}
runtime.GOMAXPROCS
Go运行时的调度器使用GOMAXPROCS参数来确定需要使用多少个OS线程来同时执行Go代码。默认值是机器上的CPU核心数。例如在一个8核心的机器上,调度器会把Go代码同时调度到8个OS线程上(GOMAXPROCS是m:n调度中的n)。
Go语言中可以通过runtime.GOMAXPROCS()函数设置当前程序并发时占用的CPU逻辑核心数。
Go1.5版本之前,默认使用的是单核心执行。Go1.5版本之后,默认使用全部的CPU逻辑核心数。
我们可以通过将任务分配到不同的CPU逻辑核心上实现并行的效果
func a() {
for i := 1; i < 10; i++ {
fmt.Println("A:", i)
}
}
func b() {
for i := 1; i < 10; i++ {
fmt.Println("B:", i)
}
}
func TestGOMAXPROCS(t *testing.T) {
runtime.GOMAXPROCS(1)//两个任务只有一个逻辑核心,此时是做完一个任务再做另一个任务。
//runtime.GOMAXPROCS(2) //将逻辑核心数设为2,此时两个任务并行执行
go a()
go b()
time.Sleep(time.Second)
}
两个任务只有一个逻辑核心,此时是做完一个任务再做另一个任务。
将逻辑核心数设为2,此时两个任务并行执行