异步文件 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 中的本地文件?的主要内容,如果未能解决你的问题,请参考以下文章