【问题标题】:Nodejs filestream concurrencyNodejs文件流并发
【发布时间】:2017-02-16 06:08:18
【问题描述】:

在我看来,我在 nodejs 中遇到了并发问题。我知道这是不可能的。

我正在逐行处理文件中的数据,并将其写入另一个文件中。在输出文件中,我注意到行被覆盖,这意味着我时不时地看到输出中的行似乎被其他行覆盖了一半。 我从读取流中读取数据。大致是这样的:

let iStream = fs.createReadStream(inputFile);
let oStream = fs.createWriteStream(outputFile);
let remaining = '';

iStream.on('data',(data)=>{
  remaining += data;
  let line = remaining.split(/\r?\n/);
  let lines = line.length;
  if(lines > 0) {
    remaining = line[lines - 1];
    line.length = lines - 1;
    line.forEach((curr)=>{
      oStream.write(processLine(curr));
    });
});

这种方案是否有可能产生写入失败,还是我必须寻找其他地方?

【问题讨论】:

  • processLine() 是做什么的?是完全同步的吗?仅供参考,您可以使用remaining = line.pop() 简化您的代码。
  • 另外,请注意.write() 返回布尔值,指示输出缓冲区是否已满,您必须等待drain 事件再次开始写入。见the doc
  • 您可能想使用transform stream,然后使用.pipe(),它将为您处理所有流控制。
  • 我猜你写缓冲区溢出了,因此丢失了数据。
  • 谢谢,这听起来像是我正在做的事情。它包含大量数据,我实际上想知道流控制的来源......

标签: javascript node.js file-io concurrency


【解决方案1】:

这似乎是缓冲区溢出问题。您可能会溢出写入缓冲区,但没有注意流控制。

您可以将回调传递给.write(),并且仅在调用该回调时继续进行下一次写入,或者您可以注意.write()的返回值,当它返回false时,您必须这样做等待流上的drain 事件,然后再写一些。

另一种方法是编写transform stream,然后使用.pipe(),让流式基础架构为您管理流控制。

【讨论】:

  • Transformer 像魅力一样工作,而且源代码更少。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 2013-01-31
相关资源
最近更新 更多