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) ; 阻塞

3个答案

0

由 klauswuestefeld 发布的评论

更通用的例子

执行以下操作

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

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

如果在那时c被关闭,>!将返回false。

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

0

由 andrewhr 发布的评论

据我所知,close!实现遵循所有take,并运行它们各自的回调以释放。

我采取的方法是对put也这样做,以确保之前被停放put将被释放,就像这个错误的通用案例所展示的那样。

在同一个补丁中,我添加了一个断言这种行为的单个测试,并将相同代码移植到ClojureScript实现。我可以在不同的补丁上拆分这两个实现,但我认为将所有内容放在一起将简化审查。

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