Clojure异步-频道中的项目顺序

时间:2018-09-18 16:22:31

标签: asynchronous clojure core.async

我在理解以下代码示例的输出时遇到了一些困难。

(def ch (a/chan 1))

(a/go-loop []
  (Thread/sleep 1000)
  (a/onto-chan ch [1 2 3 4 5] false)
  (recur))

(a/go-loop []
  (Thread/sleep 500)
  (let [val (a/<! ch)]
    (println val))
  (recur))

我希望看到的是每个打印到REPL的数字之间有500ms的延迟,在另一个范围开始打印之前按顺序接收1-5的数字。

但是,当将Thread / sleep引入从通道读取的go块中时,数字似乎是交错的。我给人的印象是,从商品中检索商品的顺序与将商品放入商品中的顺序相同?

有什么我想念的吗?

1 个答案:

答案 0 :(得分:4)

onto-chan异步执行。您的第一个go-loop的每次执行基本上都会启动一个新过程,将值并行地放入通道中。请注意文档,其中指出Returns a channel which will close after the items are copied.

如果您等待onto-chan完成,则会得到预期的结果:

(def ch (async/chan 1))

(async/go-loop []
  (Thread/sleep 1000)
  (async/<! (async/onto-chan ch [1 2 3 4 5] false))
  (recur))

(async/go-loop []
  (Thread/sleep 500)
  (when-let [val (async/<! ch)]
    (println val)
    (recur)))