首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >node.js的误解?

node.js的误解?
EN

Stack Overflow用户
提问于 2010-10-04 19:04:08
回答 2查看 1.8K关注 0票数 4

来自node.js页面

Node中几乎没有函数直接执行I/O,因此进程从不阻塞。因为没有任何阻碍,少于专家程序员能够开发快速的系统。

所以,如果一个比专家程序员做的事情,比如在回调中启动一个无限循环,它不会杀死系统(最终)吗?

或者,更现实地说,有人做了一些效率低下的事情,处理请求需要很长时间(比如半秒或其他什么)。“无障碍”(Nothing Blocks)、“快速系统”( -> 'fast systems)的说法似乎是有根本缺陷的。

有人能解释一下,在这种情况下,系统如何不会出现性能问题?看上去会..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-05 22:30:23

基本上,你的CPU速度太快了。太快了。

你的记忆也快疯了。

你的硬盘不是快疯了。

互联网非常缓慢(REST、RPC等)。

node.js的目标是确保您的CPU在任何时候都保持忙碌,通过缓慢的事情事件。那就是,而不是

代码语言:javascript
复制
var html = download_file_from_slow_internet(url);
 /* do what-ever-what-ever to that poor HTML */

你会做这样的事

代码语言:javascript
复制
download_file_from_slow_internet_with_an_awesome_callback(url, function(html) {
 /* do what-ever-what-ever to that poor HTML */
});

从你想要做的角度来看,无论做什么,CPU都很有可能是绑定的.不管是谁创建了函数download_file_from_slow_internet_with_an_awesome_callback,都有责任确保它在某个时候调用您的回调。

在您的示例中,无限循环是纯CPU。使用node.js,它会使整个服务器陷入停顿,这是非常糟糕的。所以,不要写无限循环。

记住,“小于专家程序员”是相对的。专家程序员知道和理解线程,锁定,条件,互斥,种族条件。如果不使用多线程,则可以避免所有问题。那么,为什么一开始就引入线程呢?

他们是以这种方式被引入的,因为CPU变得非常快,人们注意到等待IO是没有意义的。也就是说,您可以加载数据并同时处理它。当然,这也带来了许多问题。大多数套接字库都引入了非阻塞IO来解决网络问题,但这就引入了一种基本的不同的编程方式。

您必须使用状态机,并且状态机在非专家手中是令人不快的,并且非常错误。如果您曾经使用过C中的低级套接字状态机,那么您就知道我在说什么了。

这就是node.js骑着白马进来的地方。对于node.js,状态机是通过使用闭包进行回调而隐式的。这也叫做延拓传递。

现在的想法是,我说做这个,然后传递一个函数,上面写着“当你做完,就叫这个”。由于JavaScript支持闭包,所以使用该语言隐式传递状态并构建状态机是可行的。

现在的node.js是构建自定义服务器和构建健壮web应用程序的一个很好的平台。它是在PHP、Ruby和C之间构建服务的好地方。

我建议将它用于原型服务器,如果您担心JavaScript的性能税,那么您可以帮助我完成node.ocaml,但这会使node.js看起来很慢。

票数 7
EN

Stack Overflow用户

发布于 2010-10-04 19:55:46

只是因为写了些东西并不意味着它是对的。你得用常识。

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

https://stackoverflow.com/questions/3858288

复制
相关文章

相似问题

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