node.js误解?

hvg*_*des 4 performance node.js

从node.js页面

Node中几乎没有任何函数直接执行I/O,因此进程永远不会阻塞.因为没有什么阻止,不太专业的程序员能够开发快速系统.

所以,如果一个不太专业的程序员做了类似的事情,就像在回调中启动无限循环一样,它不会杀死系统(最终)?

或者,更现实地说,有人做了一些低效率的事情,并且需要很长时间来处理请求(比如说半秒钟或其他什么).感觉就像声称'没有阻止' - >'快速系统'从根本上是有缺陷的.

有人可以解释在这种情况下系统不会遇到性能问题吗?好像它会......

Mat*_*tor 7

基本上,你的CPU速度很快.这很疯狂.

你的记忆也很快.

你的硬盘并不快疯狂.

互联网非常慢(REST,RPC等).

node.js旨在通过制作慢事件来确保您始终保持CPU忙碌.也就是说,而不是

var html = download_file_from_slow_internet(url);
 /* do what-ever-what-ever to that poor HTML */
Run Code Online (Sandbox Code Playgroud)

你会做点什么的

download_file_from_slow_internet_with_an_awesome_callback(url, function(html) {
 /* do what-ever-what-ever to that poor HTML */
});
Run Code Online (Sandbox Code Playgroud)

根据你想做的事情,尽可能地做什么有可能限制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看起来很慢.