Regarding this post正如那篇文章提到的,我们不再需要放入runtime.Gosched(),因为Go1.15
但我还是在Go1.19中得到了问题。简单地说,
- 我不使用运行时。Goshed()
- 我使用了runtime.GOMAXPROCS(2)
如果我使用runtime.Ghoshed(),它可以完美地工作。但是如果没有它,Go似乎在移动到另一个之前完全执行了一个goroutine。
下面是代码
func say(s string) {
for i := 0; i < 5; i++ {
fmt.Println(s)
}
}
func main() {
runtime.GOMAXPROCS(2)
go say("Hello")
say("World")
time.Sleep(time.Second)
}
输出(这看起来是合作的,而不是抢先的)
Hello
Hello
Hello
Hello
Hello
World
World
World
World
World
预料到了这样的事情
Hello
World
Hello
World
Hello
World
Hello
World
Hello
我的CPU
fmt.Println(runtime.NumCPU())
Output: 12
1条答案
按热度按时间1yjd4xko1#
我们不需要再放runtime.Gosched()了,你的测试给你一种错觉,一个线程运行了,然后又执行了另一个线程。这是因为你的cpu运行得更快了。你可以简单地添加一个sleep,测试的输出将是一个正常的并发输出。