使用异步在 Node.js 中批量处理并行 HTTP 请求
Processing parallel HTTP requests in batches in Node.js using async
我的代码结构大致如下:
readLine.on('line', function (line) {
async.parallel([
function (callback) {
// HTTP request #1 sent with accompanied JSON, get JSON as result
},
function (callback) {
// HTTP request #2 sent with accompanied JSON, get JSON as result
}],
function (error, results) {
// write to local file
})
我用 line-by-line
模块实现了输入流。
我的问题是,一旦我的代码开始 运行 30 秒左右,我就会收到 ECONNREFUSED
和 ECONNRESET
错误,我认为这是因为我所有的 TCP 连接都超载了(所有HTTP 请求转到本地主机服务器)。我必须阅读的文本文件大约有 200,000 行,这绝对无济于事。
有什么方法可以批量处理线路和 HTTP 请求,并等待所有请求都通过并成功返回,这样我的 TCP 套接字就不会过载吗?
在此先感谢您的帮助和建议。
一个选项是使用 async.queue
,它具有可配置的并发性。
var queue = async.queue(function(task, queueCallback) {
async.parallel([
function (callback) {
// HTTP request #1 sent with accompanied JSON, get JSON as result
},
function (callback) {
// HTTP request #2 sent with accompanied JSON, get JSON as result
}],
function (error, results) {
// write to local file
...
// call the queue callback
queueCallback(error);
})
}, 10); // 10 concurrent 'tasks' max
readLine.on('line', function (line) {
queue.push({ line : line });
});
我的代码结构大致如下:
readLine.on('line', function (line) {
async.parallel([
function (callback) {
// HTTP request #1 sent with accompanied JSON, get JSON as result
},
function (callback) {
// HTTP request #2 sent with accompanied JSON, get JSON as result
}],
function (error, results) {
// write to local file
})
我用 line-by-line
模块实现了输入流。
我的问题是,一旦我的代码开始 运行 30 秒左右,我就会收到 ECONNREFUSED
和 ECONNRESET
错误,我认为这是因为我所有的 TCP 连接都超载了(所有HTTP 请求转到本地主机服务器)。我必须阅读的文本文件大约有 200,000 行,这绝对无济于事。
有什么方法可以批量处理线路和 HTTP 请求,并等待所有请求都通过并成功返回,这样我的 TCP 套接字就不会过载吗?
在此先感谢您的帮助和建议。
一个选项是使用 async.queue
,它具有可配置的并发性。
var queue = async.queue(function(task, queueCallback) {
async.parallel([
function (callback) {
// HTTP request #1 sent with accompanied JSON, get JSON as result
},
function (callback) {
// HTTP request #2 sent with accompanied JSON, get JSON as result
}],
function (error, results) {
// write to local file
...
// call the queue callback
queueCallback(error);
})
}, 10); // 10 concurrent 'tasks' max
readLine.on('line', function (line) {
queue.push({ line : line });
});