Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous Clojure async-通道中项目的顺序_Asynchronous_Clojure_Core.async - Fatal编程技术网

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)

(异步/非常好!谢谢:)非常好!谢谢:)