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
by

评论由:bbloom

请勿向公共API添加关闭判定符。在99.9%的情况下,这是一个竞态条件。Go不提供这样的判定符,我在使用core.async和Go的过程中逐渐习惯了CSP,从未觉得需要它。拥有这样的判定符将激发其使用。我喜欢clojure.core对有疑虑的函数的省略偏好,预计core.async也会如此。

如果有人急需这个判定符,请在IRC或Slack上询问,我相信有人可以帮助你解决你的频道/进程等的结构问题。

0
by

评论由:gshayban

同意Brandon的观点,我也感到不放心。这是一个即将发生的bug。

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