Node.js API函数是否在单独的线程中执行

时间:2015-10-03 12:03:50

标签: javascript node.js multithreading

Javascript是单线程的。因此,我编写的每一段代码都在Node提供的javascript运行时的单个线程中执行。所以当我执行以下代码时:

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
   if (err) {
       return console.error(err);
   }
   console.log("Asynchronous read: " + data.toString());
});

// Synchronous read
var data = fs.readFileSync('input.txt');

以下是我对工作流程的理解,如果我错了,请纠正我:

fs.readFile立即被Node中的 manager 从调用堆栈中弹出,然后移动到其他线程开始读取内容。

阅读完成后,节点中的管理员

  • fs.readFile的回调函数放入队列堆栈
  • 哪个事件循环最终放入调用堆栈并执行

fs.readFileSync不会从堆栈中弹出,而是像运行其他函数一样在运行时线程中执行。

那么,节点中的管理器是谁,它在其他线程中执行Node API I / O函数并管理它们的调用堆栈。

Node是否使用多核在后台执行它的API函数?

2 个答案:

答案 0 :(得分:2)

NodeJS正在使用事件循环进行异步操作。

如果您知道,有一个名为 libuv 的库。 libuv负责异步代码执行。这是一个小伪代码如何管理它:

while there are still events to process:
  e = get the next event
  if there is a callback associated with e:
    call the callback

您可以在此处详细了解libuv - http://nikhilm.github.io/uvbook/introduction.html

所以,基本上:

  

Node.js API函数是否在不同的线程中执行?

两者,是,不。如果函数可以将I / O操作移动到线程池中的单独线程,则是。否则它在同一个线程中执行。

  

那么,谁是节点中的经理谁在其他线程中执行Node API I / O函数并管理他们的调用堆栈?

libuv - https://github.com/libuv/libuv

  

Node是否使用多核在后台执行它的API函数?

我不确定,如果我错了,任何人都可以纠正我,但Node是在单核内执行的。如果要运行多核支持,则需要在集群模式下运行它。

UPD:这是一个可以帮助您理解的小图表。 How does NodeJS work

答案 1 :(得分:0)

在寻找回答这个问题的资源时,我实际上找不到任何详细的内容。有一个很好的介绍here以及有关事件循环如何在MDN上运行的一些细节

似乎V8引擎内部还有另一个线程来管理事件循环。这将采取操作系统I / O之类的响应,并将数据和相关回调添加到队列中。每当事件循环完成它所做的事情时,它就会从队列中选择下一个东西。