Clojure core.async,put(go ...)块内(doseq ..)和把它放在外面有什么区别?

时间:2013-09-04 07:24:35

标签: asynchronous clojure

我已阅读此article about core.async并了解了< ! !用于阻止主线程,直到go块返回最后一个通道。在原始示例中,< ! !并且阻止在里面(doseq ...),如果它们放在外面可以吗?看起来他们的行为是一样的。

;;original example code 
(let [c (chan)]
  (doseq [i (range 10)]
    (go
     (Thread/sleep  1000)
     (>! c i)))

  (doseq [_ (range 10)]
    (<!!
     (go
      (println (<! c))))))

;;putting <!! part outside doseq 
(let [c (chan)]
  (doseq [i (range 10)]
    (go
     (Thread/sleep  1000)
     (>! c i)))

  (<!!
   (go
    (doseq [_ (range 10)]
      (println (<! c))))))

1 个答案:

答案 0 :(得分:2)

由于<!!正在阻止,doseq将等待之前的go块在开始另一个之前结束。所以这是非常连续的。通过将doseq放在go中,您只需移动执行代码的位置,它就不会改变此代码的串行性质。

事实上,因为它是阻塞和连续的,你也可以摆脱go而只是:

(doseq [_ (range 10)]
      (println (<!! c))