不再使用 clojure core.async 通道是不是应该关闭?
Posted
技术标签:
【中文标题】不再使用 clojure core.async 通道是不是应该关闭?【英文标题】:Should clojure core.async channels be closed when not used anymore?不再使用 clojure core.async 通道是否应该关闭? 【发布时间】:2015-05-07 10:35:42 【问题描述】:Close 方法(至少在 Java 世界中)是您作为一个好公民在使用完相关资源后必须调用的方法。不知何故,我自动开始为 core.async 库中的 close! 函数应用相同的功能。据我了解,这些channels 对任何 IO 都不紧,因此我不确定是否有必要调用 close!。可以不关闭频道(本地频道)进行垃圾收集吗?
【问题讨论】:
【参考方案1】:可以将它们留给垃圾收集器除非关闭它们对您的程序有意义。通常将它们关闭作为向其他组件发出信号,表明是时候自行关闭了。其他通道旨在永久使用,并且永远不会被关闭或垃圾收集。在其他情况下,通道用于将一个值传递给消费者,然后生产者和消费者都完成并且通道被 GC'd。在最后一种情况下,无需关闭它们。
【讨论】:
很好的答案,只是一个例子。 “什么时候有意义”可以是当你使用 async/reduce 时,它需要一个封闭的输入通道才能产生一些东西。 最常见的例子是 core.async/timeout ,它使用关闭通道来表示时间已经用完并且没有产生任何值。通常会在产生一个值或而不是一个值之后关闭通道。以上是关于不再使用 clojure core.async 通道是不是应该关闭?的主要内容,如果未能解决你的问题,请参考以下文章
是否应该耗尽 clojure.core.async 通道以释放停放的 put
带有外部绑定符号的 core.async go 块可以工作,但不能进行宏扩展