【发布时间】: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