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" 中发生异常:断言失败:单个通道上不允许超过 1024 个挂起的 take 操作。
(< (.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) 的情况下,所有测试都通过了。

在我遇到这个错误所在的系统中,实际的根本问题是被放置的通道被提前关闭。实际上,如果这个缺陷不存在,我的团队可能不会注意到写入通道被提前关闭(实际上,我们直到正确的环境出现之前都没有注意到,直到几个月后)也许隐藏此类问题是建议的补丁没有被接受的原因之一?

对于具体的下一步行动建议,我们非常欢迎。

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