【问题标题】:why fs is the only I/O library to provide sync call in NodeJS为什么 fs 是 NodeJS 中唯一提供同步调用的 I/O 库
【发布时间】:2017-03-10 02:50:14
【问题描述】:

最近我正在研究这个问题。我已经阅读了 fs 源代码,发现 fs.readSync() 和 fs.read() 之间的唯一区别是

// async vrsion
  var req = new FSReqWrap();
  req.oncomplete = cb;
  binding.stat(pathModule._makeLong(path), req);

我读过一些文章说阻塞和非阻塞 fs api 调用之间的区别是异步版本将在新的 v8 工作线程中运行。

当我读到这个article - daveeddy written 关于异步与同步的 fs 系统调用性能时。结论是异步和同步调用同一个系统调用。但是异步在工作线程上运行,同步在主线程上运行。

我的问题是我注意到下面的评论说

文件系统操作是 Node.js 中最后使用阻塞系统调用(open、preadv、pwritev)的操作之一

在哪里可以找到 fs 真实系统调用?这个评论是对还是错?
这是回答我的问题“为什么 fs 是 NodeJS 中唯一提供同步调用的 I/O 库”的关键点

我真的很好奇。感谢您的耐心和进一步的建议。

【问题讨论】:

    标签: node.js asynchronous


    【解决方案1】:

    Node.js 在设计时考虑到了服务器。异步调用不会减少系统调用量,但可以让您更好地利用 CPU,方法是在 I/O 进行时继续计算,或同时执行多个 I/O。

    使用异步版本,运行时将尝试在排队时执行其他作业(回调)(因此可以进行多路复用)。使用同步版本,代码更容易,因为您无需使用回调即可获得结果。

    Node 的 IO 由 libuv 包装,不鼓励直接进行系统调用。您可以使用 ffi 进行某种原始系统调用,但可能 C 是更好的工具。

    【讨论】:

    • 感谢您的回答。我只是好奇。 :P 我的观点是无论你的 api 设计如何,你想处理 io 你必须调用系统调用。所以我想知道无论nodejs还是libuv,fs上最后的系统调用是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多