Nodejs的核心机制就是事件驱动和异步IO。但是nodejs是单进程单线程的,也就是一次只能做一件事,如何实现高并发呢?
Nodejs在主线程中维护了一个事件循环队列,当收到请求时,就将请求放入事件循环队列,然后继续接收请求。当主线程空闲时(没有新请求进入),就会检查事件循环队列中是否有事件需要处理。要处理的事件分两种,如果是非I/O任务,则主线程自己处理(同步处理,占用主进程);如果是I/O任务,则会从线程池中拿出一个线程来处理,同时指定回调函数,然后继续循环事件队列(异步处理)。
当线程中的I/O任务处理完成了,就会调用指定的回调函数,将处理完成的任务放入事件循环队列的尾部。当主线程再次循环到该事件,直接将处理结果直接返回给上层。这个过程就是事件循环Event Loop,以下是事件循环的原理图:
该事件循环包含几个部分,应用层、V8引擎层、Node API层、Libuv层。
每一层的作用如下:
应用层:即JavaScript交互层,常用的就是nodejs模块,如http,fs等;
V8引擎层:JavaScript解析器,同时和下层Nodejs API交互;
Node API层:为上层提供系统调用,一般使用C语言来实现的,同时与操作系统交互;
Libuv层:跨平台的底层库,封装了文件操作、网络操作等基本操作,是nodejs实现异步的核心;
PS: Nodejs并不是真正的单进程单线程,只是说Nodejs运行在单线程之内,底层实现还是多线程的。