美文网首页
2、Node的异步I/O请求对象

2、Node的异步I/O请求对象

作者: 萘小蒽 | 来源:发表于2019-07-26 12:31 被阅读0次

对于一般的(非异步)回调函数,函数由我们自行调用:

var froEach = function (list, callback) {
  for (let i = 0; i < list.length; i++) {
    callback(list[i], i, list)
  }
}

而对于Node中的异步I/O调用而言,回调函数却不由开发者来调用。

我们从发出调用异步后,到回调被执行,中间发生了什么呢?
从JavaScript发出调用异步,到内核执行异步I/O操作的过渡过程中,存在一种中间产物,它叫做请求对象

以简单的fs.open()方法来作为例子:

fs.open = function (path, flags, mode, callback) {
  // ...
  binding.open(pathModule._makeLong(path), stringToFlags(flags), mode, callback);
};

fs.open()的作用是根据指定路径和参数去打开一个文件,从而得到一个文件描述符,这是后续I/O的初始操作

fs.open()调用示意图
  1. JavaScript调用node的核心模块,核心模块调用C++内建模块,内建模块通过libuv进行系统调用,这是node里经典的调用方法。
  2. 上面图中libuv作为封装层,有两个平台的实现,实质上是调用了uv_fs_open()方法。
  3. uv_fs_open()的调用过程中,创建了一个FSReqWrap请求对象。从JavaScript层传入的参数和当前方法都被封装在这个请求对象中。
  4. 最为关注的回调函数则被设置在这个FSReqWrap请求对象的oncomplete_sym属性上。

请求对象是异步I/O过程中重要中间产物,所有的状态都保存在这个对象中,包括送入线程池等待执行以及I/O操作完毕后的回调处理。

对象包装完毕后,在windows下,则调用queueUserWorkitm()方法将这个FSReqWrap请求对象推入线程池中等待执行。

至此,JavaScript调用立即返回,由JavaScript层面发起的异步调用的第一阶段就此结束。JavaScript线程可以继续执行当前任务的后续操作。当前的I/O操作在线程池中等待执行,不管它是否阻塞I/O,都不会影响到JavaScript线程的后续执行,达到了异步的目的。

相关文章

  • 3、Node的异步I/O执行回调

    续上前面的 Node的异步I/O Node的异步I/O——请求对象 在组装好请求对象、送入I/O线程池中等待执行,...

  • 2、Node的异步I/O请求对象

    对于一般的(非异步)回调函数,函数由我们自行调用: 而对于Node中的异步I/O调用而言,回调函数却不由开发者来调...

  • Node 简介

    Node的特点 Node的特点有:异步I/O、事件与回调函数、单线程、跨平台 异步I/O 在Node中,异步I/O...

  • 深入浅出node.js 之读书笔记

    node特点 (1) 异步 I/O操作:绝大多数的操作都是以异步的方式进行调用,包括文件操作及网络请求; (2) ...

  • node面试题(一)

    一、node请求的原理? node.js使用的是单线程模型,对所有I/O都采用异步的请求方式。node.js在执行...

  • Node的底层调用你知道吗?

    完成整个异步I/O环节的有事件循环、观察者和请求对象等。 事件循环 首先,我们着重强调一下Node自身的执行模型—...

  • Node.js 调用栈

    Node.js 是异步非阻塞I/O的。如何解释 Node.js 即是单线程又是异步且非阻塞I/O的,需要理解 No...

  • node 异步 I/O

    这篇文章主要讲 nodejs 中的异步 IO,关于同步、异步、阻塞、非阻塞 请移步这里。 事件循环 和 消息队列 ...

  • node异步I/O

    让I/O与CPU计算并行 Node 在*nix平台,通过线程池实现(主线程和I/O线程),在windows下使用I...

  • 前端进阶全栈-Node的异步IO

    本文力图详尽解释node的异步IO: 异步IO的产生背景 Node中的异步IO具体的实现 非I/O的异步API 一...

网友评论

      本文标题:2、Node的异步I/O请求对象

      本文链接:https://www.haomeiwen.com/subject/zaucrctx.html