Asynchronous Clojure-Core.async管道+;迷惑

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

我很难理解Clojure异步库中的一个非常简单的概念。我基本上是用管道创建两个通道,其中输出通道是使用输入通道的take函数创建的

据我所知,take的目的是限制通道在关闭前接收的项目数量(如果此时输入通道尚未关闭)。然而,我一直在玩的代码示例并没有产生我预期的结果

以以下代码为例:

(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