-
单线程
Node.js本身是多线程的,只是在解释我们编写的javascript代码时是由一个线程完成的,而底层是采用了多线程的方式来处理各种I/O操作的。
-
事件循环
在Node.js启动动时, 会创建一个类似于while(true)的循环,每执行一次循环体的过程称为Tick,这个一直循环遍历待处理事件的机制叫做事件循环机制。我的个人理解是遍历内置的所有观察者的实例对象。
-
异步I/O
Node.js执行异步I/O操作示意图:
1:当执行IO操作时,Node.js底层会先创建观察者对象
2:然后将观察者对象加入到事件队列中
3:成功后会立即返回,这样就不会影响到JavaScript线程的后续执行,就达到了异步IO的目的。
4-5-6由Node底层实现:当底层线程池获取到有需要处理的I/O操作,便分配线程执行该操作,当执行完后释放该线程,把该事件加入到已完成的I/O队列中等待处理,这只是为了方便理解画的示意图。实际过程是:当主线程(我们编写的Node.js代码)有I/O操作时Node.js底层首先创建对应的观察者对象(文件、网络等请求)①,然后主线程直接返回继续执行后续的代码。同时Node.js遍历所有的观察者对象,并判断是否需要进行I/O操作,如果有则分配线程进行I/O处理,处理完成后归还线程,并设置观察者的I/O操作执行状态。当Node.js底层再次遍历观察者时,发现该对象的I/O操作执行状态已完成,则通知主线程执行响应的回调函数。②个人对①和②的理解为:Node.js底层在每个Tick过程中,取出的观察者,判断如果有待处理的I/O事件,则为其分配线程进行I/O处理,处理完后修改该观察者的执行状态;如果I/O事件的执行状态已完成,则执行该对象绑定的回调函数。
参考资料:
http://blog.csdn.net/xiangzhihong8/article/details/53954600?locationNum=13&fps=1
<深入浅出Node.js>