当在源通道关闭的同时触碰多功能连接器时,触动通道可能不会被关闭。
(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 原子添加一个标志来表示多功能连接器是打开的还是关闭的来实现。如果它被关闭,任何触动的通道将自动关闭。