为了账号安全,请及时绑定邮箱和手机立即绑定

goroutine 调度如何与 GOMAXPROCS 一起工作?

goroutine 调度如何与 GOMAXPROCS 一起工作?

Go
繁星淼淼 2022-05-23 15:49:16
我对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在计算Fibonacci时显示 ASCII 动画。当我设置GOMAXPROCS为 时1,我认为只有一个线程来执行 goroutine 并且 Fibonacci 函数没有任何意义来让步动画 goroutine。但是这个演示仍然有效。它在计算时显示动画。Go 如何在没有 goroutine 切换的情况下做到这一点?
查看完整描述

1 回答

?
米脂

TA贡献1836条经验 获得超3个赞

其中包括:编译器在每个函数调用处插入潜在的切换点,因此每个递归调用都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


你应该看到你的微调器'卡住'


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信