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

该补丁只为 ClojureScript 版本的 core.async 添加了 'closed?',为什么不在 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发表

与Brandon意见相同,我也不太相信。这是一个等待发生的错误。

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