thw*_*lms 4 javascript asynchronous node.js
我是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');
});
Run Code Online (Sandbox Code Playgroud)
大约一半的时间我运行它,它打印appended buffer2之前appended buffer1.但是当我打开文本文件时,数据总是看起来是正确的顺序 - Buffer(1024)后面跟着一堆垃圾1234567890.我本来期待反向或乱七八糟的混乱.
这里发生了什么?难道我做错了什么?是否存在维持秩序的某种较低级别的i/o队列?
我已经看到一些关于与Node的文件系统i/o差异的讨论; 我在Mac上,如果这有任何区别.
根据我的理解,虽然代码是异步的,但在操作系统级别,SAME文件的文件I/O操作却不是.这意味着一次只有一个文件I/O操作处理单个文件.
在第一个附加发生期间,文件被锁定.虽然已处理第二个附加,但它的文件I/O部分由OS放入队列并完成,没有错误状态.我的猜测是OS会做一些检查以确保写操作成功,例如文件存在,可写,磁盘空间足够大等等.如果满足所有这些条件,操作系统将返回到没有错误状态的应用程序并在可能的情况下稍后完成写作操作.由于第二个附加的缓冲区要小得多,因此在第一次附加完成写入文件之前可能会完成处理(不写入文件的一部分).因此,您首先看到了第二个console.log().
| 归档时间: |
|
| 查看次数: |
782 次 |
| 最近记录: |