【问题标题】:When to close channels [duplicate]何时关闭频道[重复]
【发布时间】:2020-06-09 04:10:53
【问题描述】:

查看 Go 中的一些工作池示例,我无法确定关闭通道的一致方法。例如,这个project on Github 似乎关闭了所有频道,而这个similar implementation 并没有关闭一个频道!我知道关闭频道表示完成;无法在其上发送更多值。但它只是一个运行时断言吗?不打开通道也会留下内存泄漏吗?或者你只是依赖垃圾收集?如果我要明确地关闭第二个示例中打开的频道,我会在哪里关闭?

【问题讨论】:

  • "通道不像文件;你通常不需要关闭它们。只有在必须告诉接收器没有更多值到来时才需要关闭,例如终止范围循环。” tour.golang.org/concurrency/4
  • 谢谢!知道如何在第二个示例中关闭通道仍然很有趣。特别是如何正确关闭readyPool中的嵌套通道。

标签: go concurrency threadpool


【解决方案1】:

频道可以以任何你喜欢的方式使用:

  • 如果您要发送有限数量的项目,则关闭通道向侦听器表明没有更多项目即将到来
  • 如果您实施连续流(微服务等),则通道将永远不会关闭。
  • 通道关闭事件可用于发出事件信号

注意:您确实不必必须关闭一个频道才能对其进行垃圾收集。一旦频道超出生产者和消费者的范围,即使频道上有未读的项目,也会被回收。

【讨论】:

  • 感谢您的快速回复!我的结论是,关闭我链接的 Github 项目中的通道只会有助于清理,以防用户在停止后忘记取消引用整个池(因为它只能启动一次)。
猜你喜欢
  • 1970-01-01
  • 2021-04-23
  • 2012-09-05
  • 2012-02-10
  • 2011-11-22
  • 2020-04-26
  • 2016-12-26
  • 1970-01-01
  • 2019-03-29
相关资源
最近更新 更多