Node.js之非阻塞IO 与 事件循环

  • Post author:
  • Post category:其他

非阻塞IO

1 阻塞和非阻塞的区别:

1.1 阻塞:

什么是阻塞: 无数据准备好,系统调用比如read,recvfrom就会挂起,等到有数据准备好或者有数据了才继续执行系统调用,最后才从系统调用的函数中返回

1.2 非阻塞:

什么又是非阻塞呢:非阻塞就是是通过忙轮询去检测是否有数据准备好,没有数据准备好就一直轮询,直到有数据准备好了可以开始进行数据的复制了为止。(之后的步骤不受到影响)

1.3 理解

光从定义上来理解有点不好去理解,那么我们来用例子去说明剖析一下:

这么来看,今天已经安排好了一个很好的计划,先去修电视,然后买菜,买完菜了呢,回家做饭,中午吃过饭后去洗衣服,结果呢拿着电视去修,修电视的店铺关门了,一你可以继续等,那么之后的操作就要等到电视修好了再去,二你可以先去买菜,然后回家去做饭,可以在吃过饭后再拿着电视去修,这时候如果店铺还没有开门,可以先回去洗衣服,洗过衣服再来,那么这就是对应的俩种结果。

一呢就类似阻塞:先前的操作没有进行完毕,那么之后的操作编不会进行,所有说系统调用进程就会挂起,等准备好了在去继续执行

二呢就类似非阻塞:先前的操作没有进行或因为一些原因无法进行,那么先跳过这个操作,进行之后的,在之后的操作进行一轮后呢,再去询问先前的操作,反复去轮询

阻塞和非阻塞都是从第一个步骤来看的

当然呢Node.js就是采用了这种机制,当javascript发出一个Ajax请求去服务器获取 数据,正在回调函数里写了写了相关 response 的处理代码。 JavaScript 引擎就会告诉宿主环境: “嘿,我现在要 暂停执⾏了,但是当你完成了这个⽹络请求,并且获取到数据的时候,请回来调⽤这个函 数。“然后宿主环境(浏览器)设置对⽹络响应的监听,当返回时,它将会把回调函数插⼊到事 件循环队列⾥然后执⾏。

事件循环

2 事件循环:

2.1 什么是事件循环

事件循环就是事件不断去执行一个操作处理流程,直到所有的执行完毕

每一个Node.js进程有一个主进程执行,形成执行栈

之外还有一个事件队列,用户请求和异步操作事先进入该队列中排队,直到主进程执行完毕

主进程执行完毕,通过事件循环机制,检测事件,进行处理,分配线程池给相应的事件,直到处理完毕,返回一个结果给主进程,执行回调,将线程归还线程池,整个过程就是事件循环

事件循环流程图:

总结


版权声明:本文为weixin_46285310原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。