有关事件循环,多线程,在Node.js中执行readFile()的顺序的疑问?

问题描述 投票:0回答:1
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 multithreading readfile
1个回答
1
投票

Node.js中的文件I / O在单独的线程中运行。但这无关紧要。 Node.js always执行主线程中的所有回调。 I / O回调永远不会在单独的线程中执行(文件读取操作是在单独的线程中完成的,然后在完成读取操作后将向主线程发出运行您的回调的信号)。此[[essentially使node.js是单线程的,因为您编写的所有代码都在主线程中运行(我们当然忽略了worker_threads模块/ API,该模块/ API允许您在单独的线程中手动执行代码)。]]但是文件中的字节

并行读取(或在硬件允许的范围内并行读取-取决于可用DMA通道的数量,每个文件来自哪个磁盘等)。平行的是wait。任何语言(node.js,Java,C ++,Python等)中的异步I / O基本上都是一种API,它允许您并行wait但可以在单个线程中处理事件。此类parallel并发。它本质上是并行等待(当数据由硬件并行处理时),而不是并行代码执行。

© www.soinside.com 2019 - 2024. All rights reserved.