如何清除clojure core.async频道?

Ord*_*Ord 7 clojure core.async

我第一次看Clojure core.async,正在经历Rich Hickey的精彩演讲:http://www.infoq.com/presentations/clojure-core-async

我对他在演讲结束时展示的例子有疑问:

core.async Web示例

根据Rich的说法,这个例子基本上试图获得特定查询的Web,视频和图像结果.它为每个结果并行尝试两个不同的源,并为每个结果提取最快的结果.并且整个操作可能不会超过80毫秒,所以如果我们不能在80毫秒内获得例如图像结果,我们就会放弃."最快"的功能会创建并返回一个新频道,并启动两个过程来竞赛以检索结果并将其放在频道上.然后我们将第一个结果从"最快"的通道中取出并将其打到c通道上.

我的问题:在我们取得第一个结果之后,这三个临时的,未命名的"最快"频道会发生什么?据推测,仍有一个停止过程试图将第二个结果放到通道上,但是没有人在听,所以它从未实际完成.由于频道从未与任何东西绑定,因此我们似乎无法再对它做任何事情.流程和渠道是否会"意识到"没有人关心他们的结果并自我清理?或者我们基本上只是"泄漏"此代码中的三个通道/进程?

Mic*_*zyk 4

没有泄漏。

停放的gos 附加到它们试图执行操作的通道上,并且除此之外没有独立的存在。如果其他代码对某个停在的通道失去兴趣go(注意,如果停在/上,ago可以同时成为许多通道上的推杆/接受者),那么最终它将与这些通道一起被 GC 处理。alt!alts!

唯一需要注意的是,为了进行 GC,go实际上必须先停车。因此,任何在go不停车的情况下一直循环做事的人实际上<!都将永远存在。不过,很难偶然编写出这种代码。>!alt!alts!