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
参考: https://clojure.atlassian.net/browse/ASYNC-125 (由 alex+import 汇报)
...