gpt4 book ai didi

go - 总是与 channel 陷入僵局

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:34 26 4
gpt4 key购买 nike

我正在学习使用 Go channel ,但总是遇到死锁。这段代码可能有什么问题?当数组大小不相等时,打印机随机停止工作;我想以某种方式通知打印机接收器停止工作会有所帮助。任何想法如何解决它?我的代码粘贴在下面。

package main

import (
"fmt"
"sync"
)

var wg = sync.WaitGroup{}
var wgs = sync.WaitGroup{}
var sg = make(chan int, 50)
var gp1 = make(chan int, 50)
var gp2 = make(chan int, 50)

func main(){
wgs.Add(2)
go Sender(0)
go Sender(11)

wg.Add(3)
go Receiver()

go Printer()
go Printer2()

wg.Wait()
}

func Sender(start int){
defer wgs.Done()
for i := start; i < 20; i++ {
sg <- i
}
}

func Receiver(){
defer wg.Done()
for i := 0; i < 20; i++{
nr := <- sg
if nr % 2 == 0{
gp1 <- nr
} else{
gp2 <- nr
}
}
}

func Printer(){
defer wg.Done()
var m [10]int

for i := 0; i < 10; i++ {
m[i] = <- gp1
}

wgs.Wait()
fmt.Println(m)
}

func Printer2(){
defer wg.Done()
var m [10]int

for i := 0; i < 10; i++ {
m[i] = <- gp2
}

wgs.Wait()

fmt.Println(m)
}
// Better to use this one
// func Receiver(senderChannel <-chan int, printerChannel1 chan<- int, printerChannel2 chan<- int, wg *sync.WaitGroup) {

最佳答案

发件人生成(我认为是 28 条消息)。其中前 20 个中大约有一半转到 gp1 和 gp2 之一。 Printer 和 Printer2 然后卸载消息

问题是,Receiver 拆分消息的方式取决于收到的数字是奇数还是偶数。但是你不能控制这个。如果其中一台打印机的队列中的项目少于 10 个,它将挂起

这是一个潜在的问题

关于go - 总是与 channel 陷入僵局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53482089/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com