单线程
Node.js不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户
连接了,就触发一个内部事件,通过非阻塞I/O、事件驱动机制,让Node.js程序宏观
上也是并行的。使用Node.js,一个8GB内存的服务器,可以同时处理超过4万用户的
连接。
非阻塞I/O non-blocking I/O
例如,当在访问数据库取得数据的时候,需要一段时间。在传统的单线程处理
机制中,在执行了访问数据库代码之后,整个线程都将暂停下来,等待数据库返回
结果,才能执行后面的代码。也就是说,I/O阻塞了代码的执行,极大地降低了程序
的执行效率。
事件驱动event-driven
Node.js底层是C++(V8也是C++写的)。底层代码中,近半数都用于事件队列、
回调函数队列的构建。用事件驱动来完成服务器的任务调度,这是鬼才才能想到的。
针尖上的舞蹈,用一个线程,担负起了处理非常多的任务的使命。
阻塞和非阻塞,同步和异步是node.js里经常遇到的词汇,我举个简单的例子来说明:
我要看足球比赛,但是妈妈叫我烧水,电视机在客厅,烧水要在厨房。家里有2个水壶,一个是普通的水壶,
另一个是水开了会叫的那种水壶。我可以:
1.用普通的水壶烧,人在边上看着,水开了再去看球。(同步,阻塞)这个是常规做法,但是我看球不爽了。
2.用普通水壶烧,人去看球,隔几分钟去厨房看看。(同步,非阻塞)这个又大问题,万一在我离开的几分
钟水开了,我就麻烦了。
3.用会叫的水壶,人在边上看着。(异步,阻塞)这个没有问题,但是我太傻了。
4.用会叫的水壶,人去看球,听见水壶叫了再去看。(异步,非阻塞)这个应该是最好的。
等着看球的我:阻塞
看着电视的我:非阻塞
普通水壶:同步
会叫的水壶:异步
所以,异步往往配合非阻塞,才能发挥出威力。