Asynchronous Clojure-Core.async管道+;迷惑
我很难理解Clojure异步库中的一个非常简单的概念。我基本上是用管道创建两个通道,其中输出通道是使用输入通道的take函数创建的 据我所知,take的目的是限制通道在关闭前接收的项目数量(如果此时输入通道尚未关闭)。然而,我一直在玩的代码示例并没有产生我预期的结果 以以下代码为例:Asynchronous Clojure-Core.async管道+;迷惑,asynchronous,clojure,core.async,Asynchronous,Clojure,Core.async,我很难理解Clojure异步库中的一个非常简单的概念。我基本上是用管道创建两个通道,其中输出通道是使用输入通道的take函数创建的 据我所知,take的目的是限制通道在关闭前接收的项目数量(如果此时输入通道尚未关闭)。然而,我一直在玩的代码示例并没有产生我预期的结果 以以下代码为例: (def in (chan 1)) (def out (async/take 5 in 1)) (doseq [i (range 10)] (go (>! in i))) (pipeline 4 ou
(def in (chan 1))
(def out (async/take 5 in 1))
(doseq [i (range 10)]
(go (>! in i)))
(pipeline 4 out (filter even?) in)
(go-loop []
(when-some [val (<! out)]
(println val)
(recur))))
(def in(通道1))
(def输出(异步/五进一))
(doseq[i(范围10)]
(进入(>!进入i)))
(管道4输出(过滤均匀?)输入)
(转到循环[]
(当一些[val](
我所期望的是,管道将过滤掉奇数,只将偶数传递给“输出”通道,当输出通道接收到5个偶数时,它将关闭。然而,我看到的是打印到REPL的奇数和偶数,如下所示:
二,
7.
4.
0
8.
六,
此时,out通道仍未关闭,再次运行doseq将在最终关闭之前打印一些其他值
我对这里发生的事情感到难以置信的困惑,当使用take而不是管道时,它就像一个符咒,当不使用take但仍然使用管道时,它也起作用,将两者结合使用似乎是一个完全不同的故事。我是否遗漏了一些明显的东西?抱歉,如果这是一个简单的错误,这是我的第一次(尽管很幼稚)尝试使用core.async。您已将获取
和管道
置于竞争中。他们都从中获取项目并将其添加到输出
。替换输出
的定义:
(def out (async/chan 3))
例如,并获得预期的结果
0
2
4
6
8
如果您确实想使用async/take
,可以这样做:
(def first (async/chan 1))
(def second (async/chan 3))
(pipeline 4 second (filter even?) first)
(def third (async/take 3 second))
(defn run []
(go
(doseq [i (range 10)]
(>! first i)))
(go (loop []
(when-some [val (<! third)]
(println val)
(recur)))))
啊!完全有道理。谢谢你的帮助:)
0
2
4