给出以下代码:
package main
import (
"fmt"
"runtime"
"time"
)
func f(from string) {
for i := 0; i < 3; i++ {
fmt.Println(from, ":", i)
//runtime.Gosched()
}
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU()*2)
time.Sleep(100)
go f("i am not parallel")
go f("neither me")
var input string
fmt.Scanln(&input)
}
大多数情况下的输出是:
我不平行:0
我不平行:1
我不平行:2
不是我:0
不是我:1 不是我:2
有时候:
我都不是:0
不是我:1 不是我:2
我不平行:0
我不平行:1
我不平行:2
当runtime.Gosched()
取消注释时,一切似乎都没问题。
我已经尝试将GOMAXPROCS编号从2更改为NumCPU,goroutines的数量,周期:没有可以让它并行工作。
为什么这么奇怪的行为?
修改 好吧,似乎是上下文切换是繁重的工作,并且在没有合理问题的情况下不经常进行。我仍然无法理解的一件事 - 为什么人们get it to work没有任何睡眠指示?
答案 0 :(得分:0)
你不应该预测goroutine时间表。通过运行您提供的示例,我得到了此输出。
direct : 0
direct : 1
direct : 2
goroutine : 0
goroutine : 1
goroutine : 2
going
done
如果我在主函数的开头添加runtime.GOMAXPROCS(4)
,并在我的i5 Qcore桌面ubuntu上运行它,则输出
direct : 0
direct : 1
direct : 2
goroutine : 0
goroutine : 1
goroutine : 2
going
done
我认为并不总是产生相同的输出。所以我们应该假设goroutine可以并行,如果你需要控制序列,就加上锁定。