gpt4 book ai didi

go - 多个 go routines 从一个 channel 消耗导致数据丢失

转载 作者:IT王子 更新时间:2023-10-29 02:25:21 26 4
gpt4 key购买 nike

我是 Go 的新手。在我下面的例子中,多个 go routines 从一个无缓冲的 channel 中消耗。

代码:

var c = make(chan int)

func f() {
for val := range c {
fmt.Printf("routine 1 : %v\n", val)
}
}

func g() {
fmt.Printf("routine 2 : %v\n", <-c)
}

func main() {
go f()
go g()
c <- 0
c <- 1
c <- 2
c <- 3
c <- 4
c <- 5
close(c)
}

输出是:

routine 1 : 0
routine 1 : 2
routine 2 : 1
routine 1 : 3
routine 1 : 4

这里缺少值 5,并且永远不会打印!为什么会这样?如果我删除调用 - go g(),它会完美运行。

此外,如果我使 channel 缓冲,请说:

var c = make(chan int, 10)

根本没有输出。我知道对于无缓冲的 channel ,发送在接收完成后完成,而缓冲的情况并非如此。尽管如此,对于缓冲的情况,如果 channel 尚未发送任何 int,for 循环是否会被认为是 nil channel 而被阻塞?

请帮助解决我的两个问题。感谢所有的意见。

最佳答案

一旦 5 被消耗,程序就会退出。它没有时间打印输出。如果您运行该程序足够多次,您可能会发现在某些情况下,它确实会在关闭前打印输出,但这完全是随机的。

在退出程序之前,您需要添加一些机制来等待您的 channel 完成。

关于go - 多个 go routines 从一个 channel 消耗导致数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45914931/

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