javascript - Node.js 异步文件 I/O

标签 javascript node.js asynchronous

我是 Node.js 的新手,最近了解了 fs 模块。我对异步和同步文件 i/o 有点困惑。

考虑以下测试:

var fs = require('fs');

var txtfile = 'async.txt';
var buffer1 = Buffer(1024);
var buffer2 = '1234567890';

fs.appendFile(txtfile, buffer1, function(err) {
    if (err) { throw err };
    console.log('appended buffer1');
});

fs.appendFile(txtfile, buffer2, function(err) {
    if (err) { throw err };
    console.log('appended buffer2');
});

当我运行它时,大约有一半的时间,它会在 appended buffer1 之前打印 appended buffer2。但是当我打开文本文件时,数据似乎总是按正确的顺序排列——一堆来自 Buffer(1024) 的垃圾,然后是 1234567890。我本以为会出现相反的情况或一团糟。

这是怎么回事?难道我做错了什么?是否存在某种维持秩序的较低级别的 i/o 队列?

我看过一些关于文件系统 I/O 与 Node 的差异的讨论;如果这有什么不同的话,我在 Mac 上。

最佳答案

据我了解,虽然代码是异步的,但在操作系统层面,SAME文件的文件I/O操作不是。这意味着一次只有一个文件 I/O 操作正在处理一个文件。

在第一次附加发生时,文件被锁定。虽然第二次追加已被处理,但它的文件 I/O 部分已被操作系统放入队列中,并在没有错误状态的情况下完成。我的猜测是操作系统会做一些检查以确保写入操作成功,例如文件存在、可写、磁盘空间足够大等。如果所有这些条件都满足,操作系统会返回到应用程序,没有错误状态并在可能的情况下稍后完成写入操作。由于第二次追加的缓冲区要小得多,它可能会在第一次追加完成写入文件之前完成处理(不写入其中的文件部分)。因此,您首先看到了第二个 console.log() 。

关于javascript - Node.js 异步文件 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23427430/

相关文章:

javascript - 对对象进行赋值操作

javascript - 在不可滚动的 Div 内捕获鼠标滚轮滚动

javascript - Node.JS Child_Process 获取密码提示

javascript - ExpressJS - 带有路由分离的 Socket.IO

javascript - 从 forEach 循环 jQuery 请求变量

python - 为什么只有异步函数才能在异步代码中产生?

javascript - 如何在 SlideJS 中创建播放/暂停按钮?

javascript - 使用 Javascript 更改 iframe src

c# - ReceiveFromAsync 示例

c# - 我应该将 await 与 async Action 方法一起使用吗?