当前位置: 首页 > 后端技术 > Node.js

快速学习nodejs系列:6.Nodejs特性3--事件驱动

时间:2023-04-03 13:56:01 Node.js

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