2024 年 Clojure 状态调查! 分享您的想法。

欢迎!有关此如何工作的更多信息,请参阅 关于 页面。

0
core.async
当前补丁文件:0002-ASYNC-126-Add-public-channel-closed-predicate.patch

在 clojure.core.async 中添加一个公共函数 {{closed?}},以确定通道是否已关闭而无需放入或取出任何值。

这是一个简单的包装,围绕 {{clojure.core.async.impl.protocols/closed?}}

存在{{closed?}}和{{close!}}之间的竞争条件。正确的代码不应该依赖于{{closed?}}来检查通道是否 *打开*。应在只避免为已关闭的通道产生额外值的条件下使用{{closed?}}断言。

h2. 示例用例

生产者进程可以在执行产生下一个值的操作之前检查频道是否为{{closed?}}。


(thread
  (loop []
    (when-not (closed? ch)
      (>!! ch (do-expensive-work))
      (recur))))

5 条回答

0

评论者:dialelo

此补丁仅将 'closed?' 添加到 core.async 的 ClojureScript 版本,为什么不添加到 Clojure 版本中?

0

评论者:stuart.sierra

之前的补丁缺少 Clojure (JVM) 实现。在新的补丁 0002-ASYNC-126-Add-public-channel-closed-predicate.patch 中已修复。

0

评论者:bbloom

请不要向公共API添加闭包?谓词。在99.9%的情况下,这是一个竞态条件。Go不提供这样的谓词,我在通过core.async和Go使用CSP后,从未感到需要它。拥有这样一个谓词可能会诱发其使用。我喜欢clojure.core偏好省略可疑函数,并期望core.async也这样做。

如果有人迫切需要这个谓词,请在IRC或Slack上询问,我相信有人可以帮助你修复你的通道/进程/等结构。

0

评论人:gshayban

与Brandon的观点一致,我也感到不确定。这是一定会发生的错误。

0
参考:https://clojure.atlassian.net/browse/ASYNC-126 (由 stuart.sierra 提供)
...