请参与 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?}} 判断条件应该仅用于避免为已关闭的通道产生额外的工作。

## 示例用例

生产者进程可以在进行产生下一个值的作业之前检查通道是否 {{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持相同看法,我也感到不确信。这是一个将要发生的bug。

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