lieyeleaves 2019-06-26
上一节中,我们提到异步I/O;当I/O处理完毕后,nodejs是怎样知道I/O已经完成了呢?又是怎样去处理的呢?答案是:事件驱动(事件循环)机制。
事件驱动:
在nodejs中,当某个I/O执行完毕后,会以事件的形式通知执行I/O操作的线程;而线程去执行对应事件的回调函数。为了处理异步I/O,nodejs线程必须要有事件循环,不断的检查有没有事件要处理,并依次处理。
对于nodejs来说,不论是建立新的请求、提交、获取数据等,一切的行为都会触发相应的事件。在同一个时刻,只能执行一个事件的回调函数,但是在执行事件回调的途中,是可以去处理其他事件的(如有新连接),然后返回继续执行原事件函数,这样的处理机制,我们称为事件循环机制。其实在nodejs底层中,有一半的c++代码,都是在处理事件队列、回调函数。
好的,到这里我们已经学完了nodejs的3个特性!我们来做个总结:
nodejs的特性有3个:单线程、non-blocking I/O(非阻塞I/O)、event-driven(事件驱动);其实这3个特性都是在说同一件事。我们可以这样理解:nodejs使用的是单线程,如果多个任务(I/O)同时过来了,某个I/O是阻塞的话,那其他任务都会在等,这样性能就不会高了;这时就要异步I/O了,所有的I/O操作都要异步;这样异步I/O就好了吗?还没完,如果正在执行A任务,这时B的I/O回调了,怎么办?这就要事件循环了,不管是新用户连接,还是老用户I/O完成,都以事件的形式加入事件循环中,等待nodejs调度。(nodejs可以想象成是一个非常非常抠门的老板,只请一个服务员做所有的事情,但工作效率比请多个人还要高)