当在接近源通道关闭的同时点击mult时,可能无法正确关闭被点击的通道。
(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原子添加一个标志来实现在mult打开或关闭时的功能。如果它关闭了,任何点到已关闭源的通道将被自动关闭。