Node.js的特点:**只用一个线程来处理所有的请求,事件驱动编程**
* 店小二:线程
* 顾客:HTTP请求
* 第一类工作(迎客、找座、下单):在服务器端的代码,能快速的执行
* 后厨做菜,客人吃饭:耗时的IO操作
* 后厨大喊一声上菜:长时间IO操作之后发出的**事件**
* 结账:另一个长时间IO操作完成后发出的**事件**
* 第二类工作(上菜、结账):需要等待耗时的IO操作完成之后才能开始,也就是需要收到系统发出的**事件**之后才能开始执行。在Node.js中实际是在**回调函数**来执行
```
迎客 ();
找座 ();
下单 ();
后厨处理 ("做菜完成事件", function(){
上菜处理 ();
客人吃饭 ("吃饭完成事件",function(){
结账处理 ();
送客 ();
});
});
```
需要注意的是:
* 后厨处理()这个函数需要接收两个参数
1. 事件名:
2. 匿名回调函数,事件发生,回调函数才会执行
Node.js使用Chrome的V8引擎来执行JavaScript,效率非常高
* 代码能否写成?
```
迎客 ();
找座 ();
下单 ();
后厨处理 ("做菜完成事件", function(){
上菜处理 ();
});
客人吃饭 ("吃饭完成事件",function(){
结账处理 ();
});
送客 ();
```
不能。
因为 Node.js 执行 "后厨处理 ()" 函数时,只是安插了一个匿名的回调函数在那里,并不会等待(非阻塞 I/O),反而马上 会执行 “客人吃饭 ()" 函数,所以上述的写法会引起逻辑上的错误: 还没上菜就开始吃饭了!
所以写惯了” 顺序阻塞 I/O“的我们需要改变一下思维方式,进入到事件驱动的世界中来。
* 如果某个操作,比如说“上菜处理”是个CPU密集型的计算任务,Node.js那个唯一的线程就会忙于执行这个计算任务而被阻塞住了。后果是整个服务器就无法响应了。需要把这样的代码进行异步处理,也变称Node.js所擅长的事件驱动方式