簡體   English   中英

Clojure異步-頻道中的項目順序

[英]Clojure async - Order of items in a channel

我在理解以下代碼示例的輸出時遇到了一些困難。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM