欢迎!有关如何使用此功能的信息,请参阅关于页面。
无待处理项目时关闭水龙头是可以的,但带待处理项目关闭水龙头则会阻塞多输入通道
(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
评论者:klauswuestefeld
更通用的情况
执行以下操作
(go (println (>! c 42)))
然后关闭 c 将导致 >! 阻塞,而不是返回 false。
如果在此之后关闭 c,>! 将返回 false。
这是否是预期的竞争条件行为?
评论者:andrewhr
就我理解,close! 的实现遵循所有 take 并运行它们各自的回调以释放资源。
close!
take
我遵循的方法是对 put 也这样做,因此我们保证之前的 parked put 将被释放 - 正如这个错误的通用案例所示。
put
在同一补丁中,我为断言此行为添加了一个测试,并将相同的代码移植到 ClojureScript 实现。我可以在不同的补丁中拆分这两个实现,但我认为将它们放在一起将便于评审。