当在源通道关闭附近对多路复用进行“触摸”时,可能不会关闭被“触摸”的通道。
(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 原子添加一个标志来实现,以表示多路复用是打开还是关闭。如果是关闭的,则任何被“触摸”的通道都会自动关闭。