请分享您的想法,参加2024 Clojure 状态调查!

欢迎!请参阅关于页面以获取更多有关本站的信息。

+1投票
core.async

(let [closed (doto (a/chan) a/close!)
      open (a/chan)]
  (a/go-loop []
    (a/alts! [open [closed true]] :priority true)
    (recur)))


抛出


线程 "async-dispatch-1" 中抛出异常 java.lang.AssertionError: 断言失败:单个通道上不允许超过1024个待处理的取操作。
(< (.size takes) impl/MAX-QUEUE-SIZE)
    at clojure.core.async.impl.channels.ManyToManyChannel.take_BANG_(channels.clj:235)
    at clojure.core.async$do_alts$fn__8030.invoke(async.clj:253)
    at clojure.core.async$do_alts.invokeStatic(async.clj:245)
    at clojure.core.async$do_alts.invoke(async.clj:237)


我的分析是,当尝试在关闭的通道上写入时,应当提交处理程序,以便允许清理其他通道上的处理程序注册。

参见https://github.com/clojure/core.async/blob/822920a45e5ea7fa28641922559fdeb888c15d05/src/main/clojure/clojure/core/async/impl/channels.clj#L74-L75

3 答案

0投票

评论者:cgrand

附加补丁

0投票

评论者:tdg5

感谢您记录并提供此缺陷的补丁,Christophe!

这个缺陷/补丁是否有阻碍进一步的动作?我能做些什么来帮助推动修复工作向前推进?

我可以确认该缺陷的存在,并且附加的补丁解决了问题。我还可以确认将附加补丁应用于最新的 core.async 版本(https://github.com/clojure/core.async/commit/196f87dc21f55f601c867b796a0a421550b43c8f)后,所有测试都通过。

在我遇到这个 Bug 的系统中,实际的根本问题是将要放入的通道被提前关闭了。事实上,如果这个 Bug 不存在,我的团队可能不会注意到 put 通道被提前关闭(事实上,我们没有注意到几个月,直到合适的情况出现)。也许隐藏此类问题是建议的补丁未被接受的部分原因?

欢迎任何关于可行动的下一步的建议。

0投票
参考:https://clojure.atlassian.net/browse/ASYNC-204 (由 cgrand 提出)
...