异步文件 IO 方法如何处理 Node.js 中的本地文件?

Posted

技术标签:

【中文标题】异步文件 IO 方法如何处理 Node.js 中的本地文件?【英文标题】:How do the async file IO methods work for local files in Node.js? 【发布时间】:2013-06-12 07:22:58 【问题描述】:

Node 的所有文件系统 IO 操作都有一个异步/同步版本,但我想知道:如何在 Node.js 中实现异步文件 IO 以对本地文件进行操作?我自己在搞乱 libevent,它使用反应器模式,比如 Node,但我读到了 using evented IO on local files is pointless,因为它们将始终是可读和可写的,所以它们会立即被操作。

如果这是真的,这些方法之间有什么区别,至少对于本地文件来说是这样的?

【问题讨论】:

【参考方案1】:

查看“understanding node.js io loop”文章中的“I/O 成本”表。本地文件 IO 不是即时的。在内部,它是在异步文件 api 不可用的系统(Linux)上使用阻塞文件操作和 libuv 线程池实现的,并在可用的情况下使用内核级异步调用(例如,Windows 上的IOCP)。

我没有在不同系统上看到同步与异步文件 io 的基准测试,但值得知道的是,调度 does add some penalty 的线程池和通常池大小对应于 CPU 数量,这对 CPU 绑定的异步任务很有用,但可能不会最适合异步文件 IO 仿真。

我的猜测是,平均而言,与同步版本相比,即使是基于线程池的异步 FS 也会导致更好的服务器延迟/响应能力,尤其是在大文件上。

【讨论】:

我想我明白了......所以 Node.js 实际上在单独的线程上执行 IO?但是,libevent 没有,它只是等待文件描述符“可用”。 仅文件 IO 且仅在 linux 上。 Node.js 使用类似于 libevent 的名为 libuv 的库。这是一本关于 libuv 的好书:nikhilm.github.io/uvbook/index.html

以上是关于异步文件 IO 方法如何处理 Node.js 中的本地文件?的主要内容,如果未能解决你的问题,请参考以下文章

当循环中调用了异步函数时,Node.JS 将如何处理循环控制?

如何处理 json 并写入 node.js 中的文件

Node.js - 如何处理流错误事件

Cypress.io 如何处理异步代码

如何处理对象承诺? [复制]

Node.js:如何处理在字典中查找同名的不同城市?