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中提出,我相信有人可以帮你修复你的channel/进程等结构。

0

评论者:gshayban

遵循Brandon的意见,我也深表怀疑。这是一个即将发生的错误。

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