当多通道大约与源通道关闭同时被按下时,被按下的通道可能不会被关闭。
(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 解引用后按下的任何通道都不会被关闭。
*方法:* 解决这个问题的可能方法是在 cs 原子中始终关闭已连接到关闭源通道的通道。例如:
(let [s (chan)
m (mult s)
c (chan)]
(close! s)
(tap m c)) ;; 将始终关闭 c
这可以通过向 cs 原子添加一个标志来实现,以表示多通道是打开的还是关闭的。如果已关闭,将自动关闭任何连接的通道。