来自node.js页面
Node中几乎没有函数直接执行I/O,因此进程从不阻塞。因为没有任何阻碍,少于专家程序员能够开发快速的系统。
所以,如果一个比专家程序员做的事情,比如在回调中启动一个无限循环,它不会杀死系统(最终)吗?
或者,更现实地说,有人做了一些效率低下的事情,处理请求需要很长时间(比如半秒或其他什么)。“无障碍”(Nothing Blocks)、“快速系统”( -> 'fast systems)的说法似乎是有根本缺陷的。
有人能解释一下,在这种情况下,系统如何不会出现性能问题?看上去会..。
发布于 2010-10-05 22:30:23
基本上,你的CPU速度太快了。太快了。
你的记忆也快疯了。
你的硬盘不是快疯了。
互联网非常缓慢(REST、RPC等)。
node.js的目标是确保您的CPU在任何时候都保持忙碌,通过缓慢的事情事件。那就是,而不是
var html = download_file_from_slow_internet(url);
/* do what-ever-what-ever to that poor HTML */你会做这样的事
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看起来很慢。
发布于 2010-10-04 19:55:46
只是因为写了些东西并不意味着它是对的。你得用常识。
https://stackoverflow.com/questions/3858288
复制相似问题