【发布时间】:2016-06-20 00:59:22
【问题描述】:
在 Go 中给定一个(部分)填充的缓冲通道
ch := make(chan *MassiveStruct, n)
for i := 0; i < n; i++ {
ch <- NewMassiveStruct()
}
是否建议在关闭通道时(由作者)也将其排空,以防读者何时读取它是未知的(例如,这些通道的数量有限并且他们目前很忙)?那是
close(ch)
for range ch {}
如果通道上有其他并发读者,这样的循环是否保证结束?
上下文:具有固定数量的工作人员的队列服务,它应该在服务停止时停止处理排队的任何内容(但不一定在之后立即被 GC)。因此,我将关闭以向工作人员表明该服务正在终止。我可以立即耗尽剩余的“队列”,让 GC 释放分配的资源,我可以读取并忽略工作人员中的值,我可以离开通道,因为正在运行阅读器并将通道设置为 nil,以便GC 清理一切。我不确定哪种方法最干净。
【问题讨论】:
-
这完全取决于你程序中的逻辑。关闭通道不是清理操作,黄油通道不需要为空即可进行 GC,因此这些都不是必需的。