当多通道与源通道关闭几乎同时打开时,被打开的通道可能不会被关闭。
(require '[clojure.core.async :refer (chan mult tap close!)])
(let [s (chan)
m (mult s)
c (chan)]
 ;(tap m c)
(close! s)
(impl/closed? c))
上述代码有时会返回 true,有时会返回 false。
*原因:* 这是由以下 {{mult}} 函数中的代码引起的
(if (nil? val)
(doseq [[c close?] @cs]
(when close? (close! c)))
在 cs 解引用后的任何被打开的通道都不会被关闭。
*方法:* 一种可能的解决方案是始终关闭连接到已关闭源通道的通道。即
(let [s (chan)
m (mult s)
c (chan)]
(close! s)
 ;(tap m c)) ;; 总是关闭 c
可以通过向 cs 原子添加一个标志来表示多通道是开启还是关闭。如果是关闭状态,则任何被打开的通道会自动关闭。