無法找到此代碼死鎖的原因。這里的目的是讓工人去例行程式只有在他們收到信號后才做一些作業。
如果從代碼中洗掉了 signalStream 通道,它可以正常作業。但是當它被引入時,它就會陷入僵局。不確定原因。另外,如果有任何工具可以解釋死鎖的發生,那將有所幫助。
package main
import (
"log"
"sync"
)
const jobs = 10
const workers = 5
var wg sync.WaitGroup
func 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)
}
}
uj5u.com熱心網友回復:
在單獨的 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/450163.html
