node.js误解?

从node.js页面

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

所以如果一个比专家程序员less的事情就像在callback中启动一个无限循环一样,它不会终止系统(最终)?

或者更现实的说,某人做了一些效率低下的事情,处理请求需要很长时间(比如半秒钟或者其他)。 感觉就像“没有任何障碍” – “快速系统”有根本的缺陷。

有人可以解释一下,在这种情况下系统将不会遇到性能问题? 好像会…

基本上,你的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有责任,以确保它有时调用你的callback。

在你的例子中,一个无限循环是纯粹的CPU。 使用node.js,它将会使整个服务器变得非常糟糕。 所以,不要写无限循环。

请记住,“不及专家程序员”是相对的。 专家程序员知道并理解线程,locking,条件,互斥,竞争条件。 如果你不使用多个线程,那么你可以避免所有的问题。 那么,为什么线程首先介绍?

他们是这样引入的,因为CPU变得非常快速,人们注意到在IO上等待是没有意义的。 也就是说,您可以加载数据并同时处理它。 当然,这引起了很多问题。 大多数套接字库引入了非阻塞IO来解决这个问题,但是引入了一种根本不同的方式去思考编程。

你不得不使用状态机,状态机是非常不愉快的,而且非专家手中却是非常麻烦的。 如果你曾经在C中使用过低层套接字状态机,那么你就知道我在说什么了。

这是node.js进入一匹白马的地方。 通过使用node.js,状态机通过使用闭包进行callback是隐含的。 这也被称为延续传球。

现在的想法是,我说这样做,然后通过一个函数说:“当你完成后,调用这个”。 由于JavaScript支持闭包,因此使用该语言隐式传递状态并构build状态机是可行的。

现在,node.js是构build自定义服务器和构build健壮的Web应用程序的绝佳平台。 在PHP或Ruby和C之间build立一个服务是一个很好的地方

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

只是因为写的东西并不意味着是正确的。 你必须使用常识。