Clojure 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 的每个数字之间的 500 毫秒延迟,在另一个范围开始打印之前按顺序接收数字 1-5。

但是,在将线程/睡眠引入从通道读取的 go-block 时,数字似乎是交错的。我的印象是,从频道中检索物品的顺序与放入频道的顺序相同?

我错过了什么吗?

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)))

最新更新