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:这是一个可以帮助你理解的小图。
在寻找资源来回答这个问题时,我实际上找不到任何细节。 这里有一个很好的介绍,以及有关MDN上事件循环如何工作的一些细节
似乎pipe理事件循环的V8引擎内部有另一个线程。 这将从操作系统I / O等事件中获取响应,并将数据和相关callback添加到队列中。 每当事件循环结束时,它会从队列中select下一个事物。