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

欢迎!请参阅关于页面以获取更多有关此工作方式的信息。

0
core.async
当同时向混合中添加大量通道时,会抛出此错误

{{java.lang.AssertionError:断言失败:单个通道上允许的挂起PUT操作不超过1024个。考虑使用窗口缓冲区。}}

我们可以在REPL中使用以下内容重现问题


user> (require '[clojure.core.async :as a])
nil
user> (defn mixtest [])
  (let [out (a/chan 1024)
        mix (a/mix out)]
    (dotimes [i 2048]
      (let [chan (a/chan)]
        (a/admix mix chan)
        (a/put! chan i)))))

(mixtest)
#'user/mixtestAssertionError 断言失败:单个通道上允许的挂起PUT操作不超过1024个。考虑使用窗口缓冲区。
(< (.size puts) impl/MAX-QUEUE-SIZE)  clojure.core.async.impl.channels.ManyToManyChannel (channels.clj:150)
user>

这是在混合实现中使用无缓冲通道的结果。由于通道的功能仅仅是更新混合的内部数据结构,使用窗口缓冲通道似乎可以解决此问题。补丁0001-Change-channel-to-sliding-buffer.patch包含提出的解决方案。

2 个答案

0

评论由:angusiguess

更新补丁以包含nićl.js修复。

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