如何确定何时从作者端关闭core.async通道?

时间:2014-07-23 14:17:01

标签: clojure core.async

我的进程基本上是长轮询实现的一部分。简而言之,客户端向服务器发出请求,然后服务器创建一个通道并将其返回给该客户端。该频道将包含客户要求的信息。由于这旨在用于长轮询,因此客户端请求的信息可能会发生变化。如果信息发生变化,服务器会将更新写入通道,理论上,客户端可以获取更新并反映出来。

我面临的问题是,我最终可能会遇到大量频道,这会在发生更新时导致不必要的处理。我可能会更新客户不再关心的渠道。

我的解决方案是,一旦客户端停止关注信息,它就会关闭通道,这会以某种方式通知服务器,并阻止服务器进行额外的处理和更新。

服务器如何知道频道是否已关闭?在这种情况下,服务器本质上是一个编写器,不会从通道中读取任何内容。此外,所有的写作方法都包含在一个go块中,因此它总是返回一个频道(我没有看到任何nils)。有没有办法做到这一点,还是我的方法完全脱离了?

由于

3 个答案:

答案 0 :(得分:6)

截至今年早些时候,有一个名为" putret"如果由于通道关闭而导致put失败,则此更改会使所有put函数返回false。这允许这样的习语:

(when (>! c val)
  (recur (next itms)))

答案 1 :(得分:3)

请参阅下面链接中的讨论,并注意建议“您只应关闭来自制作人的频道。”

https://groups.google.com/forum/#!topic/clojure/_KzEoq0XcHQ

答案 2 :(得分:2)

您可以使用clojure.core.async.impl.protocols/closed?。在clojure core.async中有很多东西完成了99%:)

IMO"仅限制片人关闭"观点颇具误导性。制作人可能已经死亡或没有响应,或者您可能希望重新启动系统或部分系统,而不会重复使用各种alts!混淆模式,并停止频道"等