我在使用 goroutine 时面临同步问题。我的程序输出不可预测的结果。我检查了文档,对于未缓冲的频道,无法检查是否已处理所有消息。我将问题简化为这个仍然演示问题的小演示代码。显然,这不是 Golang 的问题,而是我的代码的问题。显然我没有使用正确的并发模式。问题是如何解决这个问题。如果可能,我既不想关闭通道也不想停止 hive goroutine。如果我能假设一旦所有的 bee goroutine 都完成了,那么 hive 也已经完成了(这就是我使用 wg.Wait() 尝试过的),那就太好了。package mainimport( "fmt" "sync" "time")func main() { count := int64(0) c := make(chan int64) var wg sync.WaitGroup // bees for i:=0; i<5000;i++{ wg.Add(1) go func(in chan int64) { defer wg.Done() time.Sleep(100) in <- 2 }(c) } // hive go func() { for out := range c { count += out } }() wg.Wait() // bang! but why? fmt.Println(count) }// every now and again the program prints out before it is finished// $ go run pattern1.go// 10000// $ go run pattern1.go// 9998// $ go run pattern1.go// 9998// $ go run pattern1.go// 10000// $ go run pattern1.go// 10000// $ go run pattern1.go// 9998
1 回答
有只小跳蛙
TA贡献1824条经验 获得超8个赞
您永远不会等待“hive”循环完成,因此有时您会count在完成之前打印该值。
最简单的方法是使用 WaitGroup 来通知何时关闭通道,并main在 for range 循环中阻塞:
go func() {
wg.Wait()
close(c)
}()
for out := range c {
count += out
}
http://play.golang.org/p/jK24dtG2je
- 1 回答
- 0 关注
- 174 浏览
添加回答
举报
0/150
提交
取消