2024 clojure调查中分享您的想法!

欢迎!请访问关于页面,了解更多关于此平台的详细信息。

0
core.async

在我看来,alt!!仅在通道从一开始就关闭时才完成put操作,而不会在alt!!等待时关闭。这与read操作不同,read操作完成时返回nil值。

这是预期的行为吗?如果是这样的话,那是非常’不利’的。至少应该在文档中标记一个大大的警告标记。

1 答案

+1

你能举个例子吗?

当然可以

  (def ch (chan))
  (go (println "完成" (>! ch 42))
  (Thread/sleep 100))
  (close! ch))

不会打印"完成"。我这里使用>!而不是alt!,因为我后来发现它们有相同的行为。

并且从"close!"的文档中

"逻辑关闭发生在所有put都已发送之后。因此,任何
阻塞或驻留的put将继续阻塞/驻留,直到有接收者释放它们。"

我认为这确实是预期的行为(在调用close之后,依然可以/必须读取所有挂起的写入)。

但正如我说的,>! 或 alt! 的文档中只包含“已经[关闭]”这个小小的词来表示。

背景:我们实现了自己的一种“发布/订阅”通道的变体,以及尝试向订阅者发送内容的线程。但是,在订阅者端使用'close!'可能是一个大问题 - 因为它在某些时候“工作”,但如果通道在错误的时间关闭,它会阻塞发布者。
by
您需要为您的通道指定缓冲区大小,否则它将表现得像一个大小为零的通道,是的,您必须有人完成take才能完成put。 https://github.com/clojure/core.async/blob/master/examples/walkthrough.clj#L8
...