Clojure 2024 年调查中分享您的想法!

欢迎!请查阅关于页面了解有关如何使用此页面的更多信息。

+7
core.async

遇到涉及已关闭的超时通道的竞争条件后,似乎在文档字符串中提到不应在超时通道上调用 close! 是合适的。附带的补丁调整了文档字符串以说明这一点。请告知是否想更改措辞。

4 个答案

+2

评论者:alexmiller

我认为修复它而不是编写文档更好。

+1
参考:https://clojure.atlassian.net/browse/ASYNC-109(由 alex+import 报告)
> 我认为修复它而不是编写文档更好。

我对将此错误化很感兴趣,确实可以节省我们大约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

或者,使之成为一个无操作?

...