来自node.js页面
Node中几乎没有任何函数直接执行I / O,因此该过程永远不会 块。因为没有什么阻止,不到专家的程序员才能做到 开发快速系统。
所以,如果一个不太专业的程序员做了类似的事情,就像在回调中启动无限循环一样,它不会杀死系统(最终)?
或者更现实地说,有人做了一些效率低下的事情并且需要很长时间来处理请求(比如说半秒钟或其他什么)。感觉就像声称'没有阻止' - > “快速系统”存在根本缺陷。
有人可以解释在这种情况下系统不会遇到性能问题吗?好像它会......
答案 0 :(得分:7)
基本上,你的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看起来很慢。 / p>
答案 1 :(得分:3)
仅仅因为写的东西并不意味着它是正确的。 你必须使用常识。