Node.js异步文件I / O.

时间:2014-05-02 11:47:52

标签: 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 buffer2之前打印appended buffer1。但是当我打开文本文件时,数据总是显示的顺序正确 - 来自Buffer(1024)的一堆垃圾后跟1234567890。我本来期待反向或乱七八糟的混乱。

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

我已经看到一些关于文件系统与Node的差异的讨论;如果这有任何不同,我在Mac上。

1 个答案:

答案 0 :(得分:5)

据我了解,尽管代码是异步的,但在操作系统级别,SAME文件的文件I / O操作却不是。这意味着一次只有一个文件I / O操作处理单个文件。

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