clojure.core.async - 使用&gt;!和<! - 在函数调用中

时间:2016-08-15 08:13:58

标签: asynchronous clojure

我希望能够在从go-block调用函数时停放。使用>!<!无效。

这会适当地停放。

(go (<! (chan)))

但是,如果我们有函数调用,

(defn f [c] (<! c))
(go (f (chan)))

go <!不会被go块重新调整,因为它在函数中。这有什么替代方案吗?我能想到的最接近的是为f而不是函数编写一个宏 - 是否有替代函数,而不是我可以用于此目的的<!>!

1 个答案:

答案 0 :(得分:6)

这是core.async的{​​{3}}。 go宏只重写传递的s-expression,它不能真正“查看”函数体内。

我建议按如下方式重写您的示例(如果您想使用停车场和获取):

(defn f [c] (go (<! c)))
(go (<! (f (chan))))

此外,总是有可能使用阻止放置和拍摄(<!!>!!)。

> (time (dotimes [n 100000] (<!! (go (<! (let [ch (chan)] (put! ch 1) ch))))))
"Elapsed time: 1432.751927 msecs"
nil

> (time (dotimes [n 100000] (<!! (go (<! (go (<! (let [ch (chan)] (put! ch 1) ch))))))))
"Elapsed time: 1828.132637 msecs"
nil

根据基准测试,初始方法(如果core.async支持)应该比建议的解决方法快30%。