我有一个基本上是长轮询实现的一部分的过程。简而言之,客户端向服务器发出请求,然后服务器创建一个 channel 并将其返回给该客户端。该 channel 将包含客户要求的信息。因为这旨在用于长轮询,所以客户端请求的信息可能会更改。如果信息发生变化,服务器会将更新写入 channel ,理论上,客户端可以获取更新并反射(reflect)该更新。
我面临的问题是我有可能最终拥有大量 channel ,这可能会在发生更新时导致不必要的处理。我可能会更新客户不再关心的 channel 。
我的解决方案是,一旦客户端不再关心信息,它就会关闭 channel ,这会以某种方式通知服务器,并阻止服务器进行额外的处理和更新。
服务器如何知道 channel 是否关闭?在这种情况下,服务器本质上是一个写入器,不从 channel 读取任何内容。此外,所有写入方法都包含在一个 go 块中,因此它始终返回一个 channel (我没有看到任何 nils)。有没有办法做到这一点,或者我的方法完全关闭?
谢谢
最佳答案
截至今年早些时候,有一个名为“putret”的新功能,此更改使得如果由于 channel 关闭而导致 put 失败,则所有 put 函数都会返回 false。这允许像这样的习语:
(when (>! c val)
(recur (next itms)))
关于clojure - 如何确定何时从作者端关闭 core.async channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24912971/