Node 异步IO原理

Node 异步IO原理
(个人理解,可能有错误的点,请指出,谢谢)

在Node中,Java Script是单线程的,即我们的应用程序代码是执行在单线程上的,那么当我们调用fs等I/O操作模块时,Node又是如何做到非阻塞式的异步I/O的呢?

首先,当我们调用一个fs.open方法去打开指定路径文件的时候,这个时候我们是从我们的应用程序代码中调用到了Node提供的内置核心模块,在核心模块中,又会去调用C++内建模块,而内建模块则会通过libuv去进行系统调用。在这一层的时候,会进行当前代码运行环境的判断,看看当前是处在windows环境还是*nix环境(两个环境的区别在于windows内核IOCP会直接提供线程池,而在*nix环境中是由libuv自己实现的线程池),然后再去分别调用uv_fs_open()方法。
现在调用已经到了
uv_fs_open()了,在这个方法的调用中,会生成一个请求对象
,该对象包含我们在应用层代码中传入的参数以及当前方法,并且把我们的回调方法放入该对象的oncomplete_sym属性上,用来等到I/O操作执行完成以后获取我们的回调方法。至此,我们的I/O操作已经被放入了底层的线程池中,Java Script的单线程任务已经结束了,将会继续去执行原有的其他代码。为了能够成功的执行回调,就需要我们Node中事件循环的I/O观察者了,它会不停地去检查我们的线程池中是否有已经结束的I/O请求,如果存在的话,会把请求对象取出来,将该对象中的result属性作为参数,调用oncomplete_sym属性上的回调方法,整个完整的I/O调用就结束了。

总结: Node进程中会有一个主线程在不停地执行代码,支持整个事件循环过程,所以说是单线程。但是在底层调用到的c++内建模块其实还是会运用多线程去处理我们的I/O操作以实现我们的异步非阻塞式I/O。

猜你喜欢

转载自blog.csdn.net/github_39436025/article/details/88537165