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

欢迎!有关如何使用此功能的信息,请参阅关于页面。

0
core.async

无待处理项目时关闭水龙头是可以的,但带待处理项目关闭水龙头则会阻塞多输入通道

(require '[clojure.core.async :refer :all]) (def c (chan)) (def m (mult c)) (def t (chan)) (tap m t) (>!! c :a) (close! t) (>!! c :b) ; BLOCKS

3 个回答

0

评论者:klauswuestefeld

更通用的情况

执行以下操作

(go (println (>! c 42)))

然后关闭 c 将导致 >! 阻塞,而不是返回 false。

如果在此之后关闭 c,>! 将返回 false。

这是否是预期的竞争条件行为?

0

评论者:andrewhr

就我理解,close! 的实现遵循所有 take 并运行它们各自的回调以释放资源。

我遵循的方法是对 put 也这样做,因此我们保证之前的 parked put 将被释放 - 正如这个错误的通用案例所示。

在同一补丁中,我为断言此行为添加了一个测试,并将相同的代码移植到 ClojureScript 实现。我可以在不同的补丁中拆分这两个实现,但我认为将它们放在一起将便于评审。

0
参考来源:https://clojure.atlassian.net/browse/ASYNC-125(由 alex+import 报告)
...