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也做同样的事情,因此我们保证了之前停泊的put将被释放 - 如此错误的一般情况所演示。

在同一个补丁中,我添加了一个测试来断言这种行为,并将相同的代码移植到ClojureScript实现。我可以在不同的补丁中分解这两个实现,但我觉得将一切放在一起会更容易筛选。

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