2024 Clojure 状态调查 中分享您的想法!

欢迎!请查看 关于 页面以获取更多关于如何使用的详细信息。

0
core.async

在我看来,只有当通道从一开始就关闭时,alt!! 才会完成 put 操作,当 alt!! 等待通道关闭时则不会。这与读取操作不同,读取操作会以 nil 值完成。

这是预期行为吗?如果是这样的话,这显然是不利的。至少应该在文档中用大大的警告标志标明。

1 答案

+1

你能提供一个例子吗?

当然

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

永远不会打印 "Done"。我这里使用 >! 而不是 alt!,因为在当时我发现了它有相同的行为。

还有关于 'close!' 的文档。

"逻辑上关闭发生在所有的 put 操作都已交付之后。因此,任何
被阻塞或停泊的 put 将会保持在阻塞/停泊状态,直到一个接受者释放它们。"

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

但是正如我所说的,关于 >! 或 alt! 的文档只包含“已经[关闭]”这个短语来表示这一点。

背景介绍:我们有自己的“订阅-发布”通道变体实现,以及尝试向订阅者发送内容的线程。但是,在订阅者端使用 'close!' 可能会成为一个重大的问题 —— 有时看似可以工作,但如果在错误的时间关闭通道,则会导致发布者死锁。
by
您需要为您的通道指定一个缓冲区大小,否则它将像大小为零的通道一样工作,是的,您无法完成 put,直到有人完成 take。 https://github.com/clojure/core.async/blob/master/examples/walkthrough.clj#L8
...