欢迎!请在关于页面查看更多信息,了解该功能如何工作。
不带挂起项关闭关卡是正常的,但关闭带有挂起项的关卡会阻塞多输入通道
(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) ; 阻塞
由 klauswuestefeld 发布的评论
更通用的例子
执行以下操作
(go (println (>! c 42)))
然后关闭c会导致>!阻塞,而不是返回false。
如果在那时c被关闭,>!将返回false。
这个竞态条件是否是预期的行为?
由 andrewhr 发布的评论
据我所知,close!实现遵循所有take,并运行它们各自的回调以释放。
我采取的方法是对put也这样做,以确保之前被停放put将被释放,就像这个错误的通用案例所展示的那样。
在同一个补丁中,我添加了一个断言这种行为的单个测试,并将相同代码移植到ClojureScript实现。我可以在不同的补丁上拆分这两个实现,但我认为将所有内容放在一起将简化审查。