我已阅读此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))))))
答案 0 :(得分:2)
由于<!!
正在阻止,doseq
将等待之前的go块在开始另一个之前结束。所以这是非常连续的。通过将doseq
放在go
中,您只需移动执行代码的位置,它就不会改变此代码的串行性质。
事实上,因为它是阻塞和连续的,你也可以摆脱go
而只是:
(doseq [_ (range 10)]
(println (<!! c))