gpt4 book ai didi

go - goroutine日程安排如何与GOMAXPROCS一起使用?

转载 作者:行者123 更新时间:2023-12-01 22:43:22 25 4
gpt4 key购买 nike

我对 goroutines 感到困惑。

这是代码

func main() {
// runtime.GOMAXPROCS(1)
go spinner(100 * time.Millisecond)
const n = 45
fibN := fib(n) // slow
fmt.Printf("\rFibonacci(%d) = %d\n", n, fibN)
}

func spinner(delay time.Duration) {
for {
for _, r := range `-\|/` {
fmt.Printf("\r%c", r)
time.Sleep(delay)
}
}
}

func fib(x int) int {
if x < 2 {
return x
}
return fib(x-1) + fib(x-2)
}


那是一个简单的 goroutine 教程代码,在计算斐波那契时使用goroutine显示ASCII动画。

当我将 GOMAXPROCS设置为 1时,我认为将只有一个线程来执行goroutine,而Fibonacci函数对动画goroutine毫无意义。但是此演示仍然有效。计算时显示动画。

Go如何在没有goroutine切换的情况下做到这一点?

最佳答案

其中:编译器在每个函数调用处插入潜在的切换点,因此对fib(...)的每个递归调用都可以产生“旋转器” goroutine。

如果您尝试在没有任何函数调用的情况下实现fib,例如:

// note : this is a truly horrific way to compute the Fibonacci sequence,
// don't do this at home
// simulate the "compute Fibonacci recursively" algorithm,
// but without any function call
func fib(n int) int {
var res = 0

var stack []int
stack = append(stack, n)

for len(stack) > 0 {
// pop :
n = stack[len(stack)-1]
stack = stack[0 : len(stack)-1]

if n < 2 {
res += n
continue
}

// else : push 'n-1' and 'n-2' on the stack
stack = append(stack, n-1, n-2)
}

return res
}

https://play.golang.org/p/pdoAaBwyscr

您应该看到您的微调框“卡住”

关于go - goroutine日程安排如何与GOMAXPROCS一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60743341/

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