Node.js 中的非阻塞循环和池化?
Non blocking Loop in Node.js and pooling?
我开始玩弄 node.js 我有一个应用程序,它基本上迭代了数十万个对象并为所有对象执行一些各种异步 http 请求,并用返回的各种数据填充对象来自http请求..
这个问题更多地是关于 Node.js 的最佳实践,非阻塞操作并且可能与池有关。
如果我使用了错误的术语,请原谅我,因为我是新手,请随时纠正我。
所以下面是代码的简要总结
我有一个循环,它迭代了数千
//Loop briefly summarized
for (var i = 0; i < arrayOfObjects.length; i++) {
do_something(arrayOfObjects[i], function (error, result){
if(err){
//various log
}else{
console.log(result);
}
});
}
//dosomething briefly summarized
function do_something (Object, callback){
http.request(url1, function(err, result){
if(!err){
insert_in_db(result.value1, function (error,result){
//Another http request with asynchronous
});
}else{
//various logging error
}
});
http.request(url2, function(err, result){
//some various logic including db call
});
}
实际上在do_something中有一个复杂的逻辑,但现在不是真正的问题
所以我的问题如下
我认为主要问题是我的循环没有真正优化,因为它是一种阻塞事件。
所以 dosomething 中的第一个 http 请求结果是在循环完成处理然后级联之后可用的。
如果有某种方法可以使 do_something 最多同时执行 10 或 20 个池,而当池资源可用时,其余的池会排队吗?
我希望我解释清楚了,如果我需要详细信息,请随时问我。
提前感谢您的反馈,
安塞尔姆
你的循环本身并没有阻塞,但它不是最优的。它所做的其中一件事是安排 arrayOfObjects.length
个 http 请求。随着循环的进行,这些请求都将立即安排。
在 node.js 的旧版本中,您将受益于每个主机默认 5 个并发请求,但是 that default is later changed.
但随后实际打开套接字、发送请求、等待响应,这对于每个循环都是单独的。每个条目都将在自己的时间完成(在这种情况下,取决于远程主机,或者例如数据库响应时间等)。
查看 async, vasync,或者按照评论中的建议,查看其中的一些用于汇集的替代方案。
您甚至可以更进一步,使用类似 Bluebird Promise.map 的东西,并根据您的用例设置 concurrency
选项。
我开始玩弄 node.js 我有一个应用程序,它基本上迭代了数十万个对象并为所有对象执行一些各种异步 http 请求,并用返回的各种数据填充对象来自http请求.. 这个问题更多地是关于 Node.js 的最佳实践,非阻塞操作并且可能与池有关。 如果我使用了错误的术语,请原谅我,因为我是新手,请随时纠正我。
所以下面是代码的简要总结 我有一个循环,它迭代了数千
//Loop briefly summarized
for (var i = 0; i < arrayOfObjects.length; i++) {
do_something(arrayOfObjects[i], function (error, result){
if(err){
//various log
}else{
console.log(result);
}
});
}
//dosomething briefly summarized
function do_something (Object, callback){
http.request(url1, function(err, result){
if(!err){
insert_in_db(result.value1, function (error,result){
//Another http request with asynchronous
});
}else{
//various logging error
}
});
http.request(url2, function(err, result){
//some various logic including db call
});
}
实际上在do_something中有一个复杂的逻辑,但现在不是真正的问题 所以我的问题如下
我认为主要问题是我的循环没有真正优化,因为它是一种阻塞事件。 所以 dosomething 中的第一个 http 请求结果是在循环完成处理然后级联之后可用的。 如果有某种方法可以使 do_something 最多同时执行 10 或 20 个池,而当池资源可用时,其余的池会排队吗?
我希望我解释清楚了,如果我需要详细信息,请随时问我。
提前感谢您的反馈,
安塞尔姆
你的循环本身并没有阻塞,但它不是最优的。它所做的其中一件事是安排 arrayOfObjects.length
个 http 请求。随着循环的进行,这些请求都将立即安排。
在 node.js 的旧版本中,您将受益于每个主机默认 5 个并发请求,但是 that default is later changed.
但随后实际打开套接字、发送请求、等待响应,这对于每个循环都是单独的。每个条目都将在自己的时间完成(在这种情况下,取决于远程主机,或者例如数据库响应时间等)。
查看 async, vasync,或者按照评论中的建议,查看其中的一些用于汇集的替代方案。
您甚至可以更进一步,使用类似 Bluebird Promise.map 的东西,并根据您的用例设置 concurrency
选项。