Go 为什么还要恐慌;“通过封闭渠道发送”;当我在发送方关闭时?
我有一个Go 为什么还要恐慌;“通过封闭渠道发送”;当我在发送方关闭时?,go,channel,Go,Channel,我有一个stopChan通知发送者关闭频道,还有一个同步。有一次确保只有一个发送者可以关闭频道,但我仍然会收到“关闭频道发送”恐慌,为什么 func muitiSenderClose(){ 常数SenderNum=3 wg:=sync.WaitGroup{} 工作组添加(发送人) intChan:=制造(chan int) stopChan:=make(chan结构{}) once:=同步。once{} 对于i:=0;i
stopChan
通知发送者关闭频道,还有一个同步。有一次确保只有一个发送者可以关闭频道,但我仍然会收到“关闭频道发送”恐慌,为什么
func muitiSenderClose(){
常数SenderNum=3
wg:=sync.WaitGroup{}
工作组添加(发送人)
intChan:=制造(chan int)
stopChan:=make(chan结构{})
once:=同步。once{}
对于i:=0;i casego
并发非常强大。协调并发非常困难。幸运的是,go
标准库有许多工具可以帮助您完成这项工作。您可能应该熟悉上下文
包
context.context
在封面下使用done频道(类似于您的stopChan
),但也有其他机制,如取消链接。它们也在整个go
标准库中用于http、数据库和其他阻塞类型请求
正如@JimB所提到的,通常在协调制作人/消费者时很少需要sync.Once
。chan
s和sync.WaitGroup
s通常就足够了
无论如何,下面是使用context.context对代码的协调修复:
在所有发送方完成后关闭频道。您需要进行同步的事实。一旦关闭频道
就表明它位于错误的位置。您还有一个数据竞争,请始终使用竞争检测器进行检查。您有多个goroutine都在intChan
上发送。它们无法全部关闭。发送方共享一个c通道需要等待所有发送方完成发送后才能关闭。