clojure - 如何确定何时从作者端关闭 core.async channel ?

标签 clojure core.async

我有一个基本上是长轮询实现的一部分的过程。简而言之,客户端向服务器发出请求,然后服务器创建一个 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/

相关文章:

java - 禁用 SSL 连接的主机名检查?

clojure - core.async是否可以通过序列来实现其功能?

clojure - 等待 Clojure 异步 channel 的惯用方式是什么?

macros - 当协议(protocol)调用表单包含 <!宏(多方法 '-item-to-ssa' 无法在 :protocol-invoke) 上调度

ios - iOS Swift 中的 core.async channel 用于解耦组件

html - 在 hiccup 中更改一个 div 颜色

emacs - 如何将以下键绑定(bind)添加到我的 Emacs init.el?

Clojure 中的 HTML 解析

clojure - core.async 不是违背 Clojure 原则吗?

clojure - 尝试运行 lein 时出现异常