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 选项。