2024 年 Clojure 调查问卷! 中分享您的想法。

欢迎!请参阅关于页面了解该是如何工作的更多信息。

0
core.async

在我看来,alt!! 只有在通道最初就关闭时才完成 put 操作,但不会在 alt!! 等待时关闭通道。这与读取操作不同,读取操作以 nil 值完成。

这是否是预期行为?如果是这样,这显然是非常“不利的”。至少应该在文档中用一个明显的警告标志标记。

1 个答案

+1

你能给一个例子吗?

当然可以

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

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

来自 'close!' 文档

"逻辑关闭发生在所有 put 操作交付之后。因此,任何
阻塞或停泊的 put 将保持阻塞/停泊状态,直到某个 take 操作释放它们。"

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

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

背景:我们自己实现了一种“pub sub”通道的变体,以及尝试向订阅者发送消息的线程。但是,在订阅者端使用 'close!' 可能会是一个大问题 - 因为有时“它起作用”,但如果通道在错误的时间关闭,则会将发布者锁定。
您需要为您的通道指定一个缓冲区大小,否则它将表现为大小为零的通道,并且您确实无法在有人完成 take 之前完成 put。 https://github.com/clojure/core.async/blob/master/examples/walkthrough.clj#L8
...