首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拉而不是推core.async频道?

拉而不是推core.async频道?
EN

Stack Overflow用户
提问于 2015-05-21 08:47:17
回答 1查看 133关注 0票数 1

我想知道为什么来自core.async通道的数据是通过一个无休止的循环中的拉机制来检索的。例如:

代码语言:javascript
复制
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。不是这样的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-21 09:13:24

core.async/go的docstring是这样的:

异步执行主体,立即返回到调用线程。此外,任何可见的调用!还有阿尔特/alts!正文中的通道操作将通过“停车”调用线程来阻止(如果必要的话),而不是绑定OS线程(或者ClojureScript中唯一的JS线程)。手术完成后,身体将恢复工作。返回一个通道,该通道将在完成时接收主体的结果。

如果go在等待队列中的新消息时不停车,那么循环在CPU上确实是非常浪费的。但是,当go循环到达<!时,它将停住线程,并且只有当队列中有一个值可用时才会恢复。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30368749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档