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

use*_*334 6 clojure core.async

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

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

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

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

谢谢

Tim*_*dge 6

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

(when (>! c val)
  (recur (next itms)))
Run Code Online (Sandbox Code Playgroud)


小智 3

请参阅下面链接中的讨论,并注意“您只能从生产者端关闭通道”的建议。

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