javascript - Nodejs 文件流并发

标签 javascript node.js file-io concurrency

在我看来,我在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));
    });
});

此方案是否有可能产生写入失败,或者我是否必须寻找其他地方?

最佳答案

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

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

另一种方法是编写 transform stream然后使用 .pipe() 并让流基础设施为您管理流量控制。

关于javascript - Nodejs 文件流并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42266202/

相关文章:

c - 如何格式化输出文本,使不同长度的可变字符串排列在多行中?

javascript - ReactJS 中的路由行为异常

javascript - 未捕获的类型错误 : Object has no method 'contains'

javascript - Node.JS 中未处理的 '' error'' 事件

c++ - C++ 读取文件

java - 有没有更好的方法来为许多分机做文件过滤?

javascript - 在 Javascript 中处理多行 HTML

javascript - AngularJS 修改指令模板中的范围

node.js - 自动重定向登录用户nodejs Passport.js

node.js - 表示 cookieSession 和 Mongoose : how can I make request. session.user 是 Mongoose 模型?