2016-03-14 100 views
0

我試圖從我的nodejs文件中讀取STDIN PIPE併發出一個POST請求到一個URL,每行給出fom STDIN然後等待響應,讀取下一行,發送,等待等nodeJS等待不能promisified的事件

'use strict'; 
const http = require('http'); 
const rl = require('readline').createInterface(process.stdin,null); 
rl.on('line', function (line) { 
    makeRequest(line); // I need to wait calling the next callback untill the previous finishes 
}).on('close',function(){ 
    process.exit(0); 
}); 

的問題是,rl.on(「線」)將立即從我的管道讀取千行,並推出成千上萬的請求即刻什麼會導致成EMFILE例外。我知道這是非阻塞IO的預期行爲,但在這種情況下,不能使用promises/futures,因爲.on('line')本身就是一個回調函數,我不能在不丟失輸入數據的情況下操作它。 因此,如果回調不能使用,並且超時黑客不夠優雅,那麼如何才能擺脫nonblockIO的詛咒?

+0

然後堆積在一個數組中並逐行消耗。 – zerkms

+0

我的輸入是巨大的,我絕對不想要,也不能將它存儲在內存/文件系統中 –

回答

2

保持活動請求的計數器(發送時遞增,響應時遞減)。一旦計數器超過一個常數(比如200),(檢查每一行'事件)調用rl.pause()。在每個響應中,檢查計數器是否小於常量,如果是,請調用rl.resume()。這應該限制內存中的請求和當前行的速率,並解決您的問題。

0

節點的readline類具有pauseresume函數,該函數按照等效的基本stream函數執行。這些功能專門用於限制管道的某些部分以幫助解決瓶頸問題。從stream.Readable.pause文檔請看下面的例子:

var readable = getReadableStreamSomehow(); 
readable.on('data', (chunk) => { 
    console.log('got %d bytes of data', chunk.length); 
    readable.pause(); 
    console.log('there will be no more data for 1 second'); 
    setTimeout(() => { 
    console.log('now data will start flowing again'); 
    readable.resume(); 
    }, 1000); 
}); 

,可以讓您的數據有多少流進你的URL抓取代碼進行細粒度控制。