2024 Clojure状态调查! 分享您的想法。

欢迎!请查看 关于页面 了解更多关于如何使用本网站的信息。

+7
core.async

在遇到涉及已关闭超时通道的竞态条件后,似乎应该在其文档字符串中提到永远不会在超时通道上调用 close!。附带的补丁对文档字符串进行了调整,以确保这一点。如果您希望修改措辞,请告知。

4 个回答

+2

评论者:alexmiller

是的,我认为修复这个问题比仅注释它更好。

+1
参考: https://clojure.atlassian.net/browse/ASYNC-109 (由 alex+import 报告)
> 我认为修复这个问题比记录它要好。

我非常欢迎把这个问题改成错误的补丁。这可能会为我们节省大约3天的时间,这3天我们正忙碌于调试服务器中的非常奇怪的超时行为。
作为一种替代方案,可以考虑还原 https://github.com/clojure/core.async/commit/ca80990bdcef6c46a93b93b82a3337fff22432d7
将其还原的另一个强烈原因是,您可能会意外地达到1024个接收者限制。请检查以下重产结果,假设您的机器足够快:
```
(let [err (promise)
      chs (into [] (repeatedly 32 #(a/timeout 1000)))]
  (doseq [ch chs]
    (dotimes [_ 33]
      (try (a/take! ch (fn [_]))
           (catch Error e
             (deliver err e)))))
  @err)
```

这也可能是现有的core.async部署中的一个潜伏者,只有在机器变快时才会浮出水面。
0 投票

评论者:hlewisship

此外,如果关闭超时通道的close!会引发一个异常会更好。

0 投票

评论者:slipset

或者,使其成为一个无操作(no-op)?

...