Almost no function in Node directly performs I/O, so the process never
blocks. Because nothing blocks, less-than-expert programmers are able
to develop fast systems.
所以,如果一个不太专业的程序员做了类似的事情,就像在回调中启动无限循环一样,它不会杀死系统(最终)?
或者,更现实地说,有人做了一些低效率的事情,并且需要很长时间来处理请求(比如说半秒钟或其他什么).感觉就像声称’没有阻止’ – > “快速系统”存在根本缺陷.
有人可以解释在这种情况下系统不会遇到性能问题吗?好像它会……
基本上,你的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看起来很慢.