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"中发生异常 Exception in thread "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](https://github.com/clojure/core.async/commit/196f87dc21f55f601c867b796a0a421550b43c8f))的所有测试都通过了。

在我遇到这个错误的问题系统中,实际的根源问题是将通道关闭得太早。事实上,如果这个错误不存在,我们团队成员可能就不会注意到PUT通道过早关闭(实际上,我们直到几个月后才注意到,直到环境条件适当)。也许正是由于掩盖了这样的问题,所以建议的补丁尚未被接受?

欢迎提出可行的下一步建议。

0
参考:[https://clojure.atlassian.net/browse/ASYNC-204](https://clojure.atlassian.net/browse/ASYNC-204)(由cgrand报告)
...