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

In NodeJS, will `fs.writeFile()` in event handler block the main thread at a certain time point?

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

例如:

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

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

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

真的是写文件启动时线程被阻塞了吗?或者无论如何阻塞都会在主线程中发生。如果是这样,有没有办法避免它?


我觉得这个问题和How the single threaded non blocking IO model works in Node.js不一样,因为这个问题主要是关于NodeJS如何与Operation System交互来进行文件操作的。

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

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

Here's a document explaining that even model.

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