我尝试从我的nodejs文件中读取STDIN PIPE 并向URL发出POST请求,其中每行都给出了STDIN,然后等待响应,读取下一行,发送等等等。
'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(' line')会立即从我的管道中读取数千行,并立即启动数千个请求,这将导致EMFILE异常。我知道这是非阻塞IO的预期行为,但在这种情况下,人们不能使用promises / futures,因为.on(' line')本身就是一个回调,我无法操纵它而不会松动来自我输入的数据。 那么,如果不能使用回调并且超时黑客不够优雅,那么如何摆脱nonblockIO的诅咒呢?
答案 0 :(得分:2)
保留活动请求的计数器(发送时递增,响应时递减)。一旦计数器超过常量(例如,200),(检查每个''行'事件)调用rl.pause()。在每个响应中,检查计数器是否小于常量,如果是,则调用rl.resume()。这应该限制请求率和内存中的当前行,并解决您的问题。
答案 1 :(得分:0)
Node的readline类具有pause
和resume
函数,这些函数遵循基础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获取代码的数量。