何时关闭频道[重复]
Posted
技术标签:
【中文标题】何时关闭频道[重复]【英文标题】:When to close channels [duplicate] 【发布时间】:2020-06-09 04:10:53 【问题描述】:查看 Go 中的一些工作池示例,我无法确定关闭通道的一致方法。例如,这个project on Github 似乎关闭了所有频道,而这个similar implementation 并没有关闭一个频道!我知道关闭频道表示完成;无法在其上发送更多值。但它只是一个运行时断言吗?不打开通道也会留下内存泄漏吗?或者你只是依赖垃圾收集?如果我要明确地关闭第二个示例中打开的频道,我会在哪里关闭?
【问题讨论】:
"通道不像文件;你通常不需要关闭它们。只有在必须告诉接收器没有更多值到来时才需要关闭,例如终止范围循环。” tour.golang.org/concurrency/4 谢谢!知道如何在第二个示例中关闭通道仍然很有趣。特别是如何正确关闭readyPool
中的嵌套通道。
【参考方案1】:
频道可以以任何你喜欢的方式使用:
如果您要发送有限数量的项目,则关闭通道向侦听器表明没有更多项目即将到来 如果您实施连续流(微服务等),则通道将永远不会关闭。 通道关闭事件可用于发出事件信号注意:您确实不必必须关闭一个频道才能对其进行垃圾收集。一旦频道超出生产者和消费者的范围,即使频道上有未读的项目,也会被回收。
【讨论】:
感谢您的快速回复!我的结论是,关闭我链接的 Github 项目中的通道只会有助于清理,以防用户在停止后忘记取消引用整个池(因为它只能启动一次)。以上是关于何时关闭频道[重复]的主要内容,如果未能解决你的问题,请参考以下文章