我希望能够在从go-block调用函数时停放。使用>!
和<!
无效。
这会适当地停放。
(go (<! (chan)))
但是,如果我们有函数调用,
(defn f [c] (<! c))
(go (f (chan)))
go <!
不会被go块重新调整,因为它在函数中。这有什么替代方案吗?我能想到的最接近的是为f
而不是函数编写一个宏 - 是否有替代函数,而不是我可以用于此目的的<!
和>!
?
答案 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%。