在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.writeFile
被 fs.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。
我知道fs.writeFile()
是异步的,会延迟执行
例如:
fs.writeFile()
console.log("non-blocking") // last statement of an event handler function
将立即打印 non-blocking
,然后该线程将花时间执行写入文件的操作。
但是,如果NodeJS App是单线程的。当线程开始执行console.log("non-blocking")
后写文件的操作。线程似乎仍在阻塞,尽管阻塞状态是延迟。如果 fs.writeFile
被 fs.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。