Node 的所有文件系统 IO 操作都有一个异步/同步版本,但我想知道:如何在 Node.js 中实现异步文件 IO 以对本地文件进行操作?我自己在搞乱 libevent,它使用反应器模式,比如 Node,但是我读到在本地文件上使用事件 IO 是没有意义的,因为它们总是可读和可写的,所以它们会立即被操作。
如果这是真的,这些方法之间有什么区别,至少对于本地文件?
Node 的所有文件系统 IO 操作都有一个异步/同步版本,但我想知道:如何在 Node.js 中实现异步文件 IO 以对本地文件进行操作?我自己在搞乱 libevent,它使用反应器模式,比如 Node,但是我读到在本地文件上使用事件 IO 是没有意义的,因为它们总是可读和可写的,所以它们会立即被操作。
如果这是真的,这些方法之间有什么区别,至少对于本地文件?
查看“理解 node.js io loop ”一文中的“I/O 成本”表。本地文件 IO不是即时的。在内部,它是在异步文件 api 不可用的系统(Linux)上使用阻塞文件操作和 libuv 线程池实现的,并在可用的情况下使用内核级异步调用(例如, Windows 上的IOCP)。
我没有在不同系统上看到同步与异步文件 io 的基准测试,但值得知道的是线程池调度确实会增加一些损失,并且通常池大小对应于 CPU 的数量,这对 CPU 绑定的异步任务很有用,但可能不是最佳的用于异步文件 IO 仿真。
我的猜测是,平均而言,与同步版本相比,即使是基于线程池的异步 FS 也会导致更好的服务器延迟/响应能力,尤其是在大文件上。