use*_*334 6 clojure core.async
我有一个基本上是长轮询实现的一部分的过程.简而言之,客户端向服务器发出请求,然后服务器创建一个通道并将其返回给该客户端.该频道将包含客户要求的信息.由于这旨在用于长轮询,因此客户端请求的信息可能会发生变化.如果信息发生变化,服务器会将更新写入通道,理论上,客户端可以获取更新并反映出来.
我面临的问题是,我最终可能会遇到大量频道,这会在发生更新时导致不必要的处理.我可能会更新客户不再关心的渠道.
我的解决方案是,一旦客户端停止关注信息,它就会关闭通道,这将以某种方式通知服务器,并阻止服务器进行额外的处理和更新.
服务器如何知道某个频道是否已关闭?在这种情况下,服务器本质上是一个编写器,不会从通道中读取任何内容.此外,所有的写入方法都包含在一个go块中,因此它总是返回一个通道(我没有看到任何nils).有没有办法做到这一点,还是我的方法完全没有?
谢谢
截至今年早些时候,有一个名为"putret"的新功能,这个更改使得所有put函数返回false,如果put由于通道关闭而失败.这允许这样的习语:
(when (>! c val)
(recur (next itms)))
Run Code Online (Sandbox Code Playgroud)