【发布时间】:2016-12-22 21:58:51
【问题描述】:
我有一个正在写入通道的函数(不是闭包)。我正在从 goroutine 调用该函数
var wg sync.WaitGroup
wg.Add(1)
go DoStuff(somechan, &wg)
在 DoStuff 里面,我有类似的东西
for ; ; {
if err == io.EOF {
fmt.Println(err)
close(somechan)
fmt.Println("Closed channel")
break
} else if err != nil {
panic(err)
}
somechan <- Somefunc()
}
现在我正在尝试使用另一个 goroutine 从该频道读取数据。
wgread.Add(1)
go func() {
for ; ; {
select {
case chanoutput, ok := <-somechan:
if ok == true {
fmt.Println(string(*chanoutput))
} else {
fmt.Println("DONE")
fmt.Println(ok)
wgread.Done()
break
}
}
}
}()
wgread.Wait()
但是,当我跑步时,我得到了
panic: sync: negative WaitGroup counter
打印后
DONE
false
DONE
false
如果我给 wgread.Add(2),它将打印上面的 DONE 和 false 3 次。
虽然我将等待组增量增加了 1,但为什么会给出一个负的等待组计数器错误?使用另一个并发函数或闭包从 goroutine 中读取的最佳方法是什么?
【问题讨论】:
-
这里的代码不足以说明问题。
标签: go synchronization closures channel goroutine