Node.jsasynchronous文件I / O

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

考虑以下testing:

 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队列?

我见过一些关于文件系统I / O与Node的区别的讨论; 我在Mac上,如果这有什么区别。

据我了解,虽然代码是asynchronous的,但在操作系统级别,SAME文件的文件I / O操作不是。 这意味着一次只能处理一个文件I / O操作到一个文件。

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