2017-02-16 71 views
0

它看起來像我在nodejs中有一個併發問題。我意識到這不應該是可能的。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)); 
    }); 
}); 

有沒有這種方案產生寫入失敗的任何可能性或我必須去別的地方看看?

+0

'processLine()'做了什麼?它完全是同步的嗎?僅供參考,您可以使用'remaining = line.pop()'來簡化代碼。 – jfriend00

+0

另請注意,'.write()'返回布爾值,表示輸出緩衝區是否已滿,您必須等待'drain'事件再次開始寫入。請參閱[文檔](https://nodejs.org/api/stream.html#stream_writable_write_chunk_encoding_callback)。 – jfriend00

+0

你可能想要使用[transform stream](http://codewinds.com/blog/2013-08-20-nodejs-transform-streams.html),然後使用'.pipe()'來處理所有的流量控制給你。 – jfriend00

回答

1

這似乎是一個緩衝區溢出問題。您可能會溢出寫入緩衝區,但不會注意流量控制。

您可以傳遞一個回調到.write(),只有下一個寫進行時調用回調函數,也可以從.write()注意的返回值,當它返回false,你必須再等待drain事件在寫更多的流之前。

另一種方法是編寫transform stream,然後使用.pipe()並讓流式基礎結構爲您管理流量控制。

+0

變壓器的作品像魅力和方式少源代碼..謝謝。 – Thomas