gpt4 book ai didi

multithreading - Goroutines - 为什么我只在最后看到并排执行

转载 作者:IT王子 更新时间:2023-10-29 01:53:20 25 4
gpt4 key购买 nike

设置

我编写了这个小程序来了解执行线程是如何工作的。这是一个简化版本,您可以在 github 上找到完整版本

func f(from string) { // Bench
// Loop for i < 40 -> fib(i)
}

func fib(n int64) int { // Something non-linear
// Fibonacci implementation
}

func main() {

go f("|||") // <- Should alternate
go f("---") // <-

var input string
fmt.Scanln(&input)
fmt.Println("done")
}

至于输出,前两行

||| fib( 0 ): 0
--- fib( 0 ): 0

然后就是---

--- fib( 28 ): 317811

此时 ||| 接管并独自到达

||| fib( 29 ): 514229

最后,他们开始“并行”执行完整的 test dump is here

--- fib( 36 ): 14930352
||| fib( 36 ): 14930352
--- fib( 37 ): 24157817
||| fib( 37 ): 24157817
--- fib( 38 ): 39088169
||| fib( 38 ): 39088169
--- fib( 39 ): 63245986
||| fib( 39 ): 63245986

问题

我最初的假设是 - 使用 go f() 我应该得到一个相对随机的并排执行,但它在不同大小的 block 中交替,在 29 次调用后收敛 ' f()' 到第一秒。为什么呢?什么是更好的测试?

最佳答案

这里有很多事情在起作用。

Go 运行时可以自由地安排您的 goroutines 以任何顺序和任何持续时间运行。因此,您应该获得“并排”执行的假设并不十分有效。另外,很可能你没有设置 GOMAXPROCS,这意味着默认情况下运行时使用你的 cpu 的单个核心。如果你设置 GOMAXPROCS > 1,运行时可以选择在多个内核线程上调度你的 goroutines,这反过来可以由内核调度在你的 CPU 的多个核心上运行。这可能会给您带来您期望的输出。

关于multithreading - Goroutines - 为什么我只在最后看到并排执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22388747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com