2016-03-14 69 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抓取代码进行细粒度控制。