当然
(def ch (chan))
(go (println "完成" (>! ch 42)))
(Thread/sleep 100)
(close! ch)
永远不会打印 "完成"。我在这里使用了 >! 而不是 alt!,因为在那时我发现了它具有相同的行为。
有关 'close!' 的文档
"逻辑关闭发生在所有 put 已传递之后。因此,
已阻塞或已停放的 put 将保持阻塞/停放状态,直到取方释放它们。
我认为这确实是预期的行为(在调用 close 后,仍可以/必须读取所有待处理的写入)。
但正如我所说的,>! 或 alt! 的文档中只包含 “已关闭” 这个小词,以此表明这一点。
背景信息:我们有自己的 Pub/Sub 通道变种的实现,以及尝试向订阅者发送内容的线程。但是,在订阅者端使用 'close!' 可能会导致许多问题 - 因为有时“可以工作”,但如果在错误的时间关闭通道,则会造成发布者死锁。