读书笔记(4) ---- Node的事件循环

92 阅读1分钟

观察者

在Node中,事件循环和JS中的事件循环很像。在进程启动的时候,Node会创建一个类似于While(true)的循环。每执行一次循环我们称之为一个Tick。每一个Tick就是查看是否有需要处理的事件,如果有,就拿出它的回调进行处理。如果在一个Tick下已经没有要处理的事件了,那么就直接退出进程。

而在一个Tick中,判断是否有事件需要处理。就是通过观察者来确定的,每个事件都有一个或者多个观察者,而判断是否有事件需要处理就是向这些观察者询问。例如网络请求,异步I/O,都有对应的观察者。

请求对象

如果我们使用fs模块的open方法,执行过程应该是什么样的呢?

第一步:在我们的代码中调用fs.open方法
第二步:调用Node的核心模块
第三步:核心模块调用C++模块
第四步:通过调用C++的核心模块,将方法的引用,方法的参数以及回调函数组装成请求对象,送入I/O线程池。

执行回调

当线程池的I/O操作执行完后,会调用Post方法通知IOCP,告知当前的对象已经执行完毕。将线程归还给线程池。

事件循环中,每一个Tick执行时,会调用IOCP的Get方法查看是否有执行完的I/0事件,如果有,就放入对应的I/O观察者队列里(宏任务队列)。