一般说明是异步文件读取更快。我想知道的是,是否存在使fs.readFile
与fs.readFileSync
根本不同的底层实现细节,或者是否将“同步”调用置于异步上下文中使其与读取的异步文件没有区别。
谢谢!
fs.readFile
是否等于setTimeout(fs.readFileSync)
?
不,两者根本不一样。 fs.readFileSync()
在readFile操作的整个过程中阻止事件循环和所有其他执行。将其放入setTimeout()
只会在其运行时发生变化,而不会改变在读取文件的整个过程中(事件运行时)事件循环仍被阻止的事实。
另一种说法,setTimeout()
仅影响它的运行时间(到将来的某个时间),它在实际运行时不会将其执行移出主事件循环。
fs.readFile()
,另一方面,会在javascript线程之外(使用libuv中的本机线程)读取所有文件,并且是非阻塞的。您调用fs.readFile()
,它立即返回,使您的代码可以执行其他操作。在读取文件时,可以处理其他事件,并可以运行其他代码。读取文件时不会阻止事件循环。然后,在读取完整个文件后,将在事件循环中发布一个事件,并且将在文件读取完成时通知主Javascript线程。
[我想知道的是,是否存在使fs.readFile与fs.readFileSync根本不同的底层实现细节
是的,有根本区别。 fs.readFile()
是异步的,并且在与Javascript线程不同的线程中读取其文件。它是非阻塞的。在其他线程中读取文件时,可以运行其他Javascript。
fs.readFileSync()
正在阻止。这意味着在读取文件的整个过程中,事件循环被阻止并且没有其他Javascript可以运行。