Node的特点有三个:单线程、事件驱动、非阻塞I/O
单线程
像java、PHP等这样的后端语言,都是多线程的,即当有一个请求过来的时候,开启一个CPU,它使计算机能够在同一时间执行多个线程。而node的单线程是指当遇到需要加载数据库、读取磁盘等请求的时候,它会将其放入“队列”中执行,待下一轮事件循环的时候再判断能否执行它的回调函数,若此时它的回调函数需要加载I/O则放入“队列”中,它的特点是线程利用率是100%。
事件驱动
举一个通俗点的例子,你在餐厅吃饭,如果当时店内生意比较好,你坐下来,服务员过来招待你,这时,另一桌也刚坐下并呼叫服务员。正常情况下,服务员肯定会想给你个菜单让你自己看看,看好了再叫他,接着去招呼那一桌的客人了,完了再给你端茶什么的。
这就是事件驱动。通过监听事件的状态变化来做出相应的操作。当你发出一个请求的时候,如果这个请求需要等待,那这个请求便会被放入“队列”中,在处理这个请求的同时,后续的无需请求也在被处理,事件处理结束后,调用请求的回调函数。注:在处理无需等待的事件时,事件循环是暂停的。
非阻塞I/O
阻塞I/O就是当用户发一个读取文件描述符的操作的时候,进程就会被阻塞,直到要读取的数据全部准备好返回给用户。那非阻塞I/O呢,就与上面的情况相反,用户发起一个读取文件描述符操作的时,函数立即返回,不作任何等待,进程继续执行。但是程序如何知道要读取的数据已经准备好了呢?最简单的方法就是轮询,即事件循环。
优点:
- 因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求,因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。
- 与Node代理服务器交互的客户端代码是由javascript语言编写的,因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。
缺点:
- Node是一个相对新的开源项目,所以不太稳定,它总是一直在变。
- 缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子(第三方库现在已经很丰富了,所以这个缺点可以说不存在了)。