2

我读过这篇关于 core.async的文章并学习了 < ! !用于阻塞主线程,直到 go 块返回最后一个通道。在原始示例中, < ! !并且 go 块在里面(剂量...),如果它们放在外面可以吗?看起来他们的行为是一样的。

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

1 回答 1

2

由于<!!is 阻塞,doseq将等待前一个 go 块结束,然后再开始另一个。所以它非常连续。通过将 放入doseqgo您只需移动代码执行的位置,并且不会改变此代码的串行性质。

事实上,因为它是阻塞和串行的,你也可以摆脱goand just:

(doseq [_ (range 10)]
      (println (<!! c))
于 2013-09-04T09:31:54.320 回答