当然
(def ch (chan))
(go (println "Done" (>! ch 42))
(Thread/sleep 100)
(close! ch)
永远不会打印 "Done"。我这里使用 >! 而不是 alt!,因为在当时我发现了它有相同的行为。
还有关于 'close!' 的文档。
"逻辑上关闭发生在所有的 put 操作都已交付之后。因此,任何
被阻塞或停泊的 put 将会保持在阻塞/停泊状态,直到一个接受者释放它们。"
我认为这确实是一种预期的行为(在调用关闭后,仍然可以/必须读取所有挂起的写入)。
但是正如我所说的,关于 >! 或 alt! 的文档只包含“已经[关闭]”这个短语来表示这一点。
背景介绍:我们有自己的“订阅-发布”通道变体实现,以及尝试向订阅者发送内容的线程。但是,在订阅者端使用 'close!' 可能会成为一个重大的问题 —— 有时看似可以工作,但如果在错误的时间关闭通道,则会导致发布者死锁。