Comment made by: gshayban
Mathieu, this is probably expected. It's important to note that to guarantee correct ordering/flow when using a mult, you should enforce it on the source/producer side of the mult, and not asynchronously on the tap side.
Mult will deref a stable set taps just before distributing a value to them, and does not adjust dynamically during value distribution except when a tap has been closed (link: 1). If you would like to stably untap without closing the tap you can/should let the 'producer' do it in an ordered fashion in between values on the input channel.
Knowing that a put occurred to a closed channel is new on release 0.1.278.
In general, walking away on the consuming side of a channel is tricky. Depending on the semantics of your processes, if the producer side of a channel isn't aware that a close! can happen from the consumer side, you might have to launch a draining operation.
(defn drain (link: c) (go (when (some? (<! c)) (recur))))
Golang disallows closing a read-only channel FWIW (link: 2)
Better documentation is probably warranted.
(link: 1) https://github.com/clojure/core.async/blob/master/src/main/clojure/clojure/core/async.clj#L680-L682
(link: 2) http://golang.org/ref/spec#Close