单线程、事件循环和异步IO

  • 单线程

    Node.js本身是多线程的,只是在解释我们编写的javascript代码时是由一个线程完成的,而底层是采用了多线程的方式来处理各种I/O操作的。

  • 事件循环

    在Node.js启动动时, 会创建一个类似于while(true)的循环,每执行一次循环体的过程称为Tick,这个一直循环遍历待处理事件的机制叫做事件循环机制。我的个人理解是遍历内置的所有观察者的实例对象。

  • 异步I/O

    Node.js执行异步I/O操作示意图:
    单线程、事件循环和异步IO_第1张图片

    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>

你可能感兴趣的:(Node.js,Node异步IO,Node单线程)