fs.readFile("./large.txt", "utf8", (err, data) => {
console.log('It is a large file')
//this file has many words (11X MB).
//It takes 1-2 seconds to finish reading (usually 1)
});
fs.readFile("./small.txt","utf8", (err, data) => {
for(let i=0; i<99999 ;i++)
console.log('It is a small file');
//This file has just one word.
//It always takes 0 second
});
结果:
控制台将始终首先打印“这是一个小文件”达99999次(大约需要3秒钟才能完成打印)。然后,在全部打印完之后,控制台不会立即打印“这是一个大文件”。 (总是在1或2秒后打印)。
我的想法:
因此,似乎第一个readFile()和第二个readFile()函数不是并行运行的。如果两个readFile()函数并行运行,那么我希望在“这是一个小文件”被打印99999次之后,第一个readFile()会在更早的时间(仅1秒)内完成读取,控制台将立即打印出第一个readFile()的回调(即“这是一个大文件”。)
我的问题是:
((1a)这是否意味着只有在第二个readFile()的回调完成其工作之后,第一个readFile()才开始读取文件?
((1b)据我所知,在nodeJs中,事件循环将readFile()传递给Libuv多线程。但是,我想知道它们以什么顺序通过。如果这两个readFile()函数不能并行运行,为什么第二个readFile()函数总是总是先执行?
(2)默认情况下,Libuv具有四个Node.js线程。那么,这两个readFile()是否在同一线程中运行?在这四个线程中,我不确定readFile()是否只有一个。
非常感谢您花费时间!欣赏!
Node.js中的文件I / O在单独的线程中运行。但这无关紧要。 Node.js always执行主线程中的所有回调。 I / O回调永远不会在单独的线程中执行(文件读取操作是在单独的线程中完成的,然后在完成读取操作后将向主线程发出运行您的回调的信号)。此[[essentially使node.js是单线程的,因为您编写的所有代码都在主线程中运行(我们当然忽略了worker_threads模块/ API,该模块/ API允许您在单独的线程中手动执行代码)。]]但是文件中的字节 是