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 将保持阻塞/停放状态,直到取方释放它们。

我认为这确实是预期的行为(在调用 close 后,仍可以/必须读取所有待处理的写入)。

但正如我所说的,>! 或 alt! 的文档中只包含 “已关闭” 这个小词,以此表明这一点。

背景信息:我们有自己的 Pub/Sub 通道变种的实现,以及尝试向订阅者发送内容的线程。但是,在订阅者端使用 'close!' 可能会导致许多问题 - 因为有时“可以工作”,但如果在错误的时间关闭通道,则会造成发布者死锁。
by
您需要为您的通道提供一个缓冲区大小,否则它将以大小为零的通道的方式运行,并且当然,您不能在有人完成提取之前完成 put。 https://github.com/clojure/core.async/blob/master/examples/walkthrough.clj#L8
...