作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 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/
我是一名优秀的程序员,十分优秀!