我最近开始学习围棋,但遇到了一个问题。我有一个简单的 go 例程,它可以将值返回或推送到通道。我的主要 fn 委托工作到这个例程,直到它满足条件或数据耗尽。此代码似乎在“找到”频道上陷入僵局。我究竟做错了什么?有多个工人物品可以同时在多个工人身上找到一旦发现项目,应停止所有工人。func workerRoutine(data Data, found chan bool, wg *sync.WaitGroup){ defer (*wg).Done() // data processing // return on false // multiple routines can set this at the same time found <-true}func main { // .... found:=make(chan bool) var wg sync.WaitGroup itemFound:=false Loop: for i:=0; i<limit; i++ { select { case <-found: itemFound = true break Loop default: if(some_check) { wg.Add(1) go workerRoutine(mdata,found,&wg) } } } wg.Wait() // use itemFound}
1 回答
繁星coding
TA贡献1797条经验 获得超4个赞
一种可能的解决方案是避免选择语句并为接收者(或发送者,或两者)使用单独的 goroutine。例子:
package main
import "sync"
func worker(res chan bool, wg *sync.WaitGroup) {
res <- true
wg.Done()
}
func receiver(res chan bool, wg *sync.WaitGroup) {
for range res {
}
wg.Done()
}
func main() {
var wg, wg2 sync.WaitGroup
wg.Add(1)
wg2.Add(10)
found := make(chan bool)
go receiver(found, &wg)
for i := 0; i < 10; i++ {
go worker(found, &wg2)
}
wg2.Wait()
close(found)
wg.Done()
}
- 1 回答
- 0 关注
- 124 浏览
添加回答
举报
0/150
提交
取消