【问题标题】:Clojure async - Order of items in a channelClojure async - 通道中的项目顺序
【发布时间】:2019-02-22 17:50:19
【问题描述】:

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

(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 时,数字似乎是交错的。我的印象是从频道中检索项目的顺序与放入频道的顺序相同?

我有什么遗漏吗?

【问题讨论】:

    标签: asynchronous clojure core.async


    【解决方案1】:

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

    【讨论】:

    • 太棒了!谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2022-08-14
    • 2021-03-22
    • 2014-03-07
    • 1970-01-01
    • 2019-01-30
    • 2018-11-12
    相关资源
    最近更新 更多