当然可以
(def ch (chan))
(go (println "完成" (>! ch 42))
(Thread/sleep 100))
(close! ch))
不会打印"完成"。我这里使用>!而不是alt!,因为我后来发现它们有相同的行为。
并且从"close!"的文档中
"逻辑关闭发生在所有put都已发送之后。因此,任何
阻塞或驻留的put将继续阻塞/驻留,直到有接收者释放它们。"
我认为这确实是预期的行为(在调用close之后,依然可以/必须读取所有挂起的写入)。
但正如我说的,>! 或 alt! 的文档中只包含“已经[关闭]”这个小小的词来表示。
背景:我们实现了自己的一种“发布/订阅”通道的变体,以及尝试向订阅者发送内容的线程。但是,在订阅者端使用'close!'可能是一个大问题 - 因为它在某些时候“工作”,但如果通道在错误的时间关闭,它会阻塞发布者。