無(wú)法找到此代碼死鎖的原因。此處的目的是讓工作人員僅在收到信號(hào)后才執(zhí)行例行程序。如果從代碼中刪除 signalStream 通道,它可以正常工作。但是當(dāng)它被引入時(shí),它就會(huì)陷入僵局。不確定這是為什么。另外,如果有任何工具可以解釋死鎖的發(fā)生,那將有所幫助。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 回答

哆啦的時(shí)光機(jī)
TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
在一個(gè)單獨(dú)的 gorouine 中生成作業(yè),即將整個(gè)jobs循環(huán)放入一個(gè) goroutine 中。如果你不這樣做,那么dataStream <- i你的程序?qū)⒂肋h(yuǎn)不會(huì)“開始消耗數(shù)據(jù)”
// Generate jobs
go func() {
for i := 1; i <= jobs; i++ {
dataStream <- i
}
close(dataStream)
}()
https://go.dev/play/p/ChlbsJlgwdE
- 1 回答
- 0 關(guān)注
- 89 瀏覽
添加回答
舉報(bào)
0/150
提交
取消