《深入浅出node.js》笔记(一)

第一章 Node简介

为什么是JavaScript

写作Node的时候,Ryan Dahl曾经评估过C、Lua、Haskell、Ruby等语言作为备选实现,结论为:C的开发门槛高,可以预见不会有太多的开发者能将它用于日常的业务开发,所以舍弃它;Ryan Dahl觉得自己还不足够玩转Haskell,所以舍弃它;Lua自身已经含有很多阻塞I/O库,为其构建非阻塞I/O库也不能改变人们继续使用阻塞I/O库的习惯,所以舍弃它;而Ruby的虚拟机由于性能不好而落选。相比之下,JavaScript比C的开发门槛要低,比Lua的历史包袱要少,历史包袱为零,为其导入非阻塞I/O库没有额外阻力。

单线程  

Node保持了JavaScript在浏览器中单线程的特点。单线程的最大好处是不用像多线程编程那样处处在意状态的同步问题,这里没有死锁的存在,也就没有线程上下文交换所带来的性能上的开销。
单线程的弱点具体有三方面:

1. 无法利用多核CPU  
2. 错误会引起整个应用退出,应用的健壮性值得考验  
3. 大量计算占用CPU导致无法继续调用异步I/O

I/O密集型

I/O密集的优势主要在于Node利用时间循环的处理能力,而不是启动每一个线程为每一个请求服务,占用资源极少。

是否不擅长CPU密集型业务

CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起。但是适当调整和分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起,这样即可同时享受到并行异步I/O的好处,又能充分利用CPU。
对于长时间运行的计算,如果它的耗时超过普通阻塞I/O的耗时,那么应用场景就需要重新评估,因为这类计算比阻塞I/O还影响效率,甚至说就是一个纯计算的场景,根本没有I/O。


(完)

(最后修改于2015-09-23)

Table of Contents