当同时向混合体中添加大量通道时,将抛出此错误
{{java.lang.AssertionError:断言失败:单个通道上不允许超过1024个挂起的put操作。考虑使用窗口缓冲区。}}
我们可以在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 Assert failed: No more than 1024 pending puts are allowed on a single channel. Consider using a windowed buffer.
(< (.size puts) impl/MAX-QUEUE-SIZE) clojure.core.async.impl.channels.ManyToManyChannel (channels.clj:150)
user>
这是在混合实现中使用无缓冲通道的结果。由于通道的功能只是更新混合的内部数据结构,使用窗口缓冲通道似乎可以解决这个问题。补丁 0001-Change-channel-to-sliding-buffer.patch 包含了提出的解决方案。