无法找到此代码死锁的原因。此处的目的是让工作人员仅在收到信号后才执行例行程序。如果从代码中删除 signalStream 通道,它可以正常工作。但是当它被引入时,它就会陷入僵局。不确定这是为什么。另外,如果有任何工具可以解释死锁的发生,那将有所帮助。package mainimport ( "log" "sync")const jobs = 10const workers = 5var wg sync.WaitGroupfunc main() { // create channel dataStream := make(chan interface{}) signalStream := make(chan interface{}) // Generate workers for i := 1; i <= workers; i++ { wg.Add(1) go worker(dataStream, signalStream, i*100) } // Generate jobs for i := 1; i <= jobs; i++ { dataStream <- i } close(dataStream) // start consuming data close(signalStream) wg.Wait()}func worker(c <-chan interface{}, s <-chan interface{}, id int) { defer wg.Done() <-s for i := range c { log.Printf("routine - %d - %d \n", id, i) }}
1 回答
哆啦的时光机
TA贡献1779条经验 获得超6个赞
在一个单独的 gorouine 中生成作业,即将整个jobs循环放入一个 goroutine 中。如果你不这样做,那么dataStream <- i你的程序将永远不会“开始消耗数据”
// Generate jobs
go func() {
for i := 1; i <= jobs; i++ {
dataStream <- i
}
close(dataStream)
}()
https://go.dev/play/p/ChlbsJlgwdE
- 1 回答
- 0 关注
- 52 浏览
添加回答
举报
0/150
提交
取消