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