Asynchronous Clojure async-通道中项目的顺序
我在理解以下代码示例的输出时遇到一些困难Asynchronous Clojure async-通道中项目的顺序,asynchronous,clojure,core.async,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)) (def ch(a/chan 1)) (a/go循环[] (线
(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))
(def ch(a/chan 1))
(a/go循环[]
(线程/睡眠1000)
(a/Toon chan ch[1 2 3 4 5]错)
(重现)
(a/go循环[]
(线程/睡眠500)
(让[val(a)]/
我期望看到的是打印到REPL的每个数字之间有500毫秒的延迟,在另一个范围开始打印之前按顺序接收数字1-5
然而,在将线程/睡眠引入从通道读取的go块时,数字似乎是交错的。我的印象是,项目从通道中检索的顺序与放入通道的顺序相同
有什么我遗漏的吗?到chan
上异步执行。每次执行第一个go循环基本上都会启动一个新的进程,将值并行地放到通道上。请注意文档,其中说明返回一个通道,该通道将在复制项目后关闭。
如果您等待完成,您将得到预期的结果:
(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)))
(定义通道(异步/通道1))
(异步/去循环[]
(线程/睡眠1000)
(async/到chan上
异步执行。每次执行第一个go循环
基本上都会启动一个新的进程,将值并行地放到通道上。请注意文档中指出,返回一个通道,该通道将在复制项目后关闭。
如果您等待完成,您将得到预期的结果:
(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)))
(定义通道(异步/通道1))
(异步/去循环[]
(线程/睡眠1000)
(异步/非常好!谢谢:)非常好!谢谢:)