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

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'); 

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

fs.readFile被Node中的pipe理员立即popup调用堆栈,并移动到其他线程开始读取东西。

阅读完成后,Node中的pipe理员

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

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

那么,这个pipe理者是谁,在其他线程中执行Node API I / O函数并pipe理他们的调用栈。

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

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

如果你知道,有一个库叫做libuv 。 libuv负责asynchronous代码执行。 这是一个小小的伪代码,它是如何pipe理的:

 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操作来分离线程池中的线程,那么是的。 否则它在同一个线程中执行。

那么,这个pipe理者是谁,在其他线程中执行Node API I / O函数并pipe理他们的调用堆栈?

libuv – https://github.com/libuv/libuv

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

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

UPD:这是一个可以帮助你理解的小图。 NodeJS如何工作?

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

似乎pipe理事件循环的V8引擎内部有另一个线程。 这将从操作系统I / O等事件中获取响应,并将数据和相关callback添加到队列中。 每当事件循环结束时,它会从队列中select下一个事物。