Asynchronous clojure.core.async-使用>;!而且<;!在函数调用中

Asynchronous clojure.core.async-使用>;!而且<;!在函数调用中,asynchronous,clojure,Asynchronous,Clojure,我希望能够在从go块调用函数时驻车。使用>和未按预期工作 这样停车会比较合适 (go (<! (chan))) (开始( 但是,如果我们有一个函数调用 (defn f [c] (<! c)) (go (f (chan))) (定义f[c]( 不是由go块解析的,因为它是在函数中。围绕这一点有没有其他选择?我能想到的最接近的方法是为f而不是函数编写一个宏-有没有一个替代函数,而不是和!,我可以用于此目的?这是核心.async的一部分>.go宏只重写传递的s表达式,它不能真正“查看”

我希望能够在从go块调用函数时驻车。使用
>
未按预期工作

这样停车会比较合适

(go (<! (chan)))
(开始(
但是,如果我们有一个函数调用

(defn f [c] (<! c))
(go (f (chan)))
(定义f[c](
不是由go块解析的,因为它是在函数中。围绕这一点有没有其他选择?我能想到的最接近的方法是为
f
而不是函数编写一个宏-有没有一个替代函数,而不是
,我可以用于此目的?

这是
核心.async
的一部分>.go
宏只重写传递的s表达式,它不能真正“查看”函数体内部

我建议将您的示例改写如下(以防您想使用“停车”put和get):


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

我一直非常简单地使用
go
构造,没有遇到这个问题,但我仍然没有意识到
(go(如链接中所述,map不起作用。所建议的方法是否会对性能造成重大影响?
(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