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添加closed?谓词。在99.9%的情况下,这是一个竞争条件。Go不提供这样一个谓词,我通过使用core.async和Go来熟悉CSP,从未感到需要它。有谓词将引起其使用。我喜欢clojure.core省略怀疑函数的偏好,并希望从core.async得到同样的待遇。

如果有人急需这个谓词,请在IRC或Slack中提出请求,我敢肯定有人可以帮助你修复你的通道/进程等的结构。

0

评论者:gshayban

Echoing Brandon,我也不太相信。这是一个即将发生的错误。

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