在go 1.19中我们还需要runtime.Gosched()吗?

von4xj4u  于 2023-03-27  发布在  Go
关注(0)|答案(1)|浏览(211)

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
1yjd4xko

1yjd4xko1#

我们不需要再放runtime.Gosched()了,你的测试给你一种错觉,一个线程运行了,然后又执行了另一个线程。这是因为你的cpu运行得更快了。你可以简单地添加一个sleep,测试的输出将是一个正常的并发输出。

package main
import "fmt"
import "time"
//import "runtime"

func say(s string) {
    for i := 0; i < 5; i++ {
        fmt.Println(s)
        time.Sleep(time.Second)
    }
}

func main() {
    //runtime.GOMAXPROCS(2)

    go say("Hello")
    say("World")
    time.Sleep(10*time.Second)
}

相关问题