Node.js异步文件I/O

4

我是新手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文件系统I/O差异的讨论;如果我正在使用Mac,是否会有所不同呢?

1个回答

5
据我理解,尽管代码是异步的,但在操作系统层面上,同一文件的文件I/O操作不是异步的。这意味着每次只有一个文件I/O操作在处理单个文件。在进行第一次追加时,文件被锁定。虽然第二次追加已经执行,但它的文件I/O部分被操作系统放入队列中,并以无错误状态完成。我的猜测是,操作系统会进行一些检查,以确保写操作将成功,例如文件存在、可写以及磁盘空间足够等条件。如果所有这些条件都得到满足,则操作系统将以无错误状态返回到应用程序,并在可能的情况下稍后完成写入操作。由于第二个追加的缓冲区要小得多,因此在第一个追加完成写入文件之前,它可能会完成处理(未写入文件部分)。因此,你先看到了第二个console.log()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接