gpt4 book ai didi

go - 执行 goroutine 时的并发与并行

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

一个相当幼稚的围棋问题。我正在学习 go-concurrency 教程,我遇到了这个 https://tour.golang.org/concurrency/4 .

我修改了代码,在斐波那契函数中添加了打印语句。所以代码看起来像

package main

import (
"fmt"
)

func fibonacci(n int, c chan int) {
x, y := 0, 1
for i := 0; i < n; i++ {
c <- x
x, y = y, x+y
fmt.Println("here")
}
close(c)
}

func main() {
c := make(chan int, 10)
go fibonacci(cap(c), c)
for i := range c {
fmt.Println(i)
}
}

我得到了这个作为输出

here
here
here
here
here
here
here
here
here
here
0
1
1
2
3
5
8
13
21
34

我期待这里数字交错。 (因为例程是同时执行的)我想我缺少一些关于 go-routines 的基本知识。虽然不太确定。

最佳答案

这里有几件事。

  1. 您有 2 个 goroutines,一个运行 main(),一个运行 fibonacci()。因为这是一个小程序,所以没有充分的理由让 go 调度程序不在同一线程上一个接一个地运行它们,所以这就是一直发生的事情,尽管不能保证。因为 main() 中的 goroutine 正在等待 chan,所以 fibonacci() 例程首先被调度。重要的是要记住 goroutines 不是线程,它们是 go 调度程序根据自己的喜好在线程上运行的例程。

  2. 因为您将缓冲 channel 的长度传递给 fibonacci(),所以几乎可以肯定(从不依赖此行为)是 cap(c) heres 打印,之后 channel 被填充,for 循环结束,close 被发送到 changoroutine 完成。然后调度 main() goroutine 并打印 cap(c) 斐波那契数列。如果缓冲的 chan 已满,则 main() 将被重新安排: https://play.golang.org/p/_IgFIO1K-Dc

  3. 通过休眠,您可以告诉 go 调度程序放弃控制。但在实践中永远不会这样做。以某种方式重组,或者,如果必须,使用 Waitgroup。请参阅:https://play.golang.org/p/Ln06-NYhQDj

  4. 我认为您正在尝试这样做:https://play.golang.org/p/8Xo7iCJ8Gj6

关于go - 执行 goroutine 时的并发与并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52975260/

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