为什么fs是唯一在NodeJS中提供同步调用的I / O库

时间:2017-03-10 02:50:15

标签: node.js asynchronous

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

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

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

当我在异步vs同步中读取此article - daveeddy written关于fs系统调用性能时。结论是异步和同步调用相同的系统调用。但是,在工作线程上运行异步并在主线程上运行同步。

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

  

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

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

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

1 个答案:

答案 0 :(得分:0)

Node.js在设计时考虑了服务器。异步调用不会减少系统调用量,但允许您通过在I / O进行过程中继续计算或同时执行多个I / O来更好地利用CPU。

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

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