在NodeJS中,事件处理程序中的`fs.writeFile()`会在某个时间点阻塞主线程吗?

时间:2015-04-29 09:37:07

标签: node.js multithreading file asynchronous nonblocking

我知道fs.writeFile()是异步的,会被延迟执行。

例如:

fs.writeFile()
console.log("non-blocking") // last statement of an event handler function

将立即打印non-blocking,然后该线程将花时间执行写入文件的操作。

但是,如果NodeJS App是单线程的。线程启动执行console.log("non-blocking")后执行写文件的操作。虽然阻止状态为延迟,但该主题似乎仍然被阻止。如果console.log("non-blocking")fs.writeFile替换,阻止应该在fs.writeFileSync之前发生。当我在这里使用fs.writeFile时,当该事件处理程序的最后一个语句完成并且文件写入操作开始时,阻塞似乎仍然存在。

在启动文件写入操作时,线程是否被阻止?或者阻塞将在主线程中发生。如果是这样,有没有办法避免它?

我不认为问题与How the single threaded non blocking IO model works in Node.js相同,因为这个问题主要是关于NodeJS如何与操作系统交互来进行文件操作。

1 个答案:

答案 0 :(得分:3)

只有一个线程...代码。 nodejs应用程序包含/调用其他线程为您执行操作(主要是IO)并在事件上调用您的用户线程。

当您执行fs.writeFile时,操作将被提供给处理该操作的另一个本机线程。如果您回调fs.writeFile,您的用户线程将被唤醒以执行它。此异步IO操作管理的核心是libuv

Here's a document explaining that even model

编辑:我投票结束了,因为关于这个主题还有另一个更完整的质量保证。