为什么我get - go例程是睡眠错误的生产者消费者问题



下面是代码-一个生产者在一个例程和多个消费者。生产者正在向通道中注入信息,多个消费者(每个消费者都通过go-routine)应该并行地读取信息。

func main() {
alphabetArray := []string{"A", "B", "C"}
alphabetChannel := make(chan string, 3)
// producer.
go func() {
for _, alphabet := range alphabetArray {
alphabetChannel <- alphabet
}
}()
var wg sync.WaitGroup
// spawn 10 consumers, consumers represented as a go-routine.
for idx := 0; idx < 10; idx++ {
wg.Add(1)
go func() {
for alphabet := range alphabetChannel {
fmt.Println(alphabet)
}
}()
}
wg.Wait()
}

这里是去游乐场的链接- https://go.dev/play/p/yNdATAEexPB

我得到的错误是-

BC致命错误:所有例程都处于休眠状态-死锁!

在生产者完成后关闭通道,以便消费者知道何时停止:

go func() {
defer close(alphabetChannel)
for _, alphabet := range alphabetArray {
alphabetChannel <- alphabet
}
}()

让waitgroup知道消费者完成了:

go func() {
defer wg.Done()
for alphabet := range alphabetChannel {
fmt.Println(alphabet)
}
}()

相关内容

最新更新