【问题标题】:Writing to a file and simultaneously reading it to create a race condition in nodejs写入文件并同时读取它以在 nodejs 中创建竞争条件
【发布时间】:2019-12-09 17:22:36
【问题描述】:

我正在尝试写入文件并同时读取它。我能够将数据写入文件,但无法从中读取。执行此操作时不会引发错误,并且仅在读取文件流上调用 End 事件。

我最近读到我们不能在 JS 中设置竞态条件,因为它是单线程的,并且竞态条件只是由于程序中的糟糕设计而产生的。所以,我试图摆弄并试图创造一个竞争条件。我原以为节点会抛出一些错误,但遇到了这个意外的输出。


const readFile = fs.createReadStream('./1GB.bin');
const writeFile = fs.createWriteStream('./test.bin');
const read = fs.createReadStream('./test.bin');

readFile.pipe(writeFile);

try {
    read.on('data', data => {
        console.log("data!", data.length);
    })

    read.on('end', _ => {
        console.log("END!");
    })

    read.on('error', err => console.log("Phatt gaya!"))
}
catch (err) {
    console.log("CAN't read 2nd file!");
}

预期结果:尝试读取文件时抛出错误

实际结果:不抛出错误,仅触发End事件

有没有人知道它为什么会这样运行?

如果有人感兴趣,请链接到比赛条件文章: [https://blog.raananweber.com/2015/06/17/no-there-are-no-race-conditions-in-javascript/]

【问题讨论】:

    标签: node.js fs node-streams


    【解决方案1】:

    发生上述行为是因为 writeStream 会擦除文件的内容,然后读取流将文件设为空,从而触发读取流上的 End 事件。

    【讨论】:

      猜你喜欢
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      • 2010-12-07
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多