传统服务器与Node.js的比较编程
传统的服务器在面临高并发的场景时,会使用多线程方案,服务器会为客户端的请求分配一个线程,使用同步的I/O,系统经过线程切换来弥补同步I/O调用过程当中的时间开销。Apache就是使用的这种方式,因为I/O操做会消耗比较多的时间,经过多线程的方式解决高并发的问题,难以实现高性能,可是能够实现很复杂的逻辑。 可是大多数网站的服务端不须要太多的计算处理,收到请求以后交给其余的服务进行处理,将处理结果返回给客户端。所以Node.js会针对这样的应用场景使用单线程模型进行处理,并不会为每个客户端的请求建立一个线程,而是经过一个线程处理全部的请求,而后对I/O操做进行异步处理,这样的方式能够减小建立、销毁线程以及线程切换消耗的时间。安全
Node.js的事件处理机制服务器
在Node.js中采用了非阻塞的I/O机制,在这种机制下应用程序所进行的处理都不会再结束以前阻碍其余处理的进行。这些处理都是相互独立的,每个事件处理完成以后,会执行一个回调函数。 Node.js在主线程里面维护了一个事件队列,当接到请求以后就会将请求做为一个事件放在这个事件队列中,而后继续接受其余的请求。当主线程空闲的时候就开始循环事件队列。检查队列中是否有须要处理的事件,若是须要处理的事件不是I/O任务,就亲自处理,经过回调函数返回到上层调用。若是是I/O任务,就从线程池里面拿出一个线程处理这个事件,而且指定回调函数,而后继续循环队列中的其余事件。多线程
Node.js事件环原理并发
事件循环定义:当线程中的I/O任务完成以后就会执行指定的回调函数,而且将这个完成的事件放在事件队列的尾部,等待事件循环,当主线程再次循环到这个事件的时候,就会直接处理而且返回给上层调用,这个过程就是事件循环(Event Loop)。Node.js运行的原理图以下所示: 异步
这个图是整个 Node.js 的运行原理,从左到右,从上到下,Node.js 被分为了四层,分别是 应用层、V8引擎层、Node API层和LIBUV层。函数
Node.js特色及适用性高并发