繁体   English   中英

非阻塞循环在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个并发请求的优势,但是后来更改了该默认设置

但是随后实际打开套接字,发送请求,等待响应,这对于每个循环来说都是独立的。 每个条目将在自己的时间内完成(在这种情况下,取决于远程主机,例如数据库响应时间等)。

查看asyncvasync或注释中建议的许多替代方法中的一些用于池化。

您甚至可以更进一步,并根据使用情况使用设置了concurrency选项的Bluebird Promise.map之类的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM