gpt4 book ai didi

javascript - Node.js 异步文件 I/O

转载 作者:搜寻专家 更新时间:2023-10-31 23:09:37 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com