我想知道为什么来自core.async通道的数据是通过一个无休止的循环中的拉机制来检索的。例如:
user=> (def c (chan 1))
#'user/c
user=> (go-loop []
(let [x (<! c)]
(println "Got a value in this loop:" x))
(recur))
#<ManyToManyChannel clojure.core.async.impl.channels.ManyToManyChannel@30df0e27>参考文献:https://clojuredocs.org/clojure.core.async/go-loop#example-542c88e3e4b05f4d257a297b
为什么没有一个我能接上的推杆?或者为什么这样的循环不是core.async订阅者的一些实现细节呢?我认为拥有一种无休止运行的机制非常消耗cpu。不是这样的吗?
发布于 2015-05-21 09:13:24
core.async/go的docstring是这样的:
异步执行主体,立即返回到调用线程。此外,任何可见的调用!还有阿尔特/alts!正文中的通道操作将通过“停车”调用线程来阻止(如果必要的话),而不是绑定OS线程(或者ClojureScript中唯一的JS线程)。手术完成后,身体将恢复工作。返回一个通道,该通道将在完成时接收主体的结果。
如果go在等待队列中的新消息时不停车,那么循环在CPU上确实是非常浪费的。但是,当go循环到达<!时,它将停住线程,并且只有当队列中有一个值可用时才会恢复。
https://stackoverflow.com/questions/30368749
复制相似问题