gpt4 book ai didi

asynchronous - clojure.core.async - 使用 >!和 <!在函数调用中

转载 作者:行者123 更新时间:2023-12-04 04:16:29 25 4
gpt4 key购买 nike

我希望能够在从 go-block 调用函数时 parking 。使用 >!<!没有按预期工作。

这将适本地停放。

(go (<! (chan)))

但是,如果我们有一个函数调用,
(defn f [c] (<! c))
(go (f (chan)))
<!不被 go 块解析,因为它在函数中。有没有其他选择?我能想到的最接近的是为 f 写一个宏而不是函数 - 是否有替代函数,而不是 <!>!我可以用于此目的吗?

最佳答案

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

我建议按如下方式重写您的示例(以防您想使用 parking 位和 parking 位):

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

此外,总是有可能使用阻塞的 puts 和 take( <!!>!! )。
> (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%。

关于asynchronous - clojure.core.async - 使用 >!和 &lt;!在函数调用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38951543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com