【问题标题】:Handling of large array of items in nodejs在nodejs中处理大量项目
【发布时间】:2020-09-12 13:14:14
【问题描述】:

我有超过 100 个项目的数组。每个项目都点击一个网址。从项目的特定 url 获得响应后,我会在数据库中插入选项。

如果我使用异步等待,那么我必须等到 100 个项目得到处理。但是如果我做异步,那么我会得到响应,但是作为异步行为,数据库中的数据将不可见,直到所有进程都完成。

示例 1:使用异步等待

var loc = async(locations){
    return new Promise((resolve,reject) => {

        try{
            for(let item of locations){
                var response = await html(location.url);
                await insertDB(response);
            }
        }catch(e){
            console.log('error : ',e);
        }

        resolve('All operation completed successfully');
    })
}

位置(位置);

locations 是项目数组 只有当所有请求都完成时,我才会得到响应。

示例 2:异步

var loc = (locations){
    return new Promise((resolve,reject) => {

        locations.forEach(location => {
            html(location.url,(res) => {
                insertDB(response,(rows) => {

                });
            });
        })
        resolve('All operation completed successfully');
    })
}

位置(位置)

这里我会立即得到响应,但是点击和插入的过程将在后台处理。

考虑示例1,我们是否可以将循环请求分成子进程,以便在nodejs或其他任何方式中快速执行?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    这是你想要的吗?它将像您的第二个解决方案一样工作,但每次插入完成后都会得到解决

    var loc = (locations){
        return new Promise((resolve,reject) => {
            const promises = locations.map(async (location) => {
                try { 
                    var response = await html(location.url);
                    await insertDB(response);
                } catch(e) {
                    console.log('error : ',e);
                }
            })
            await Promise.all(promises);
            resolve('All operation completed successfully');
        })
    }
    

    应该有区别。你能帮我测试一下性能时间吗?
    solution1() 作为您的第一个解决方案函数
    solution2() 作为我的解决方案函数

    console.time('solution1');
    await solution1(locations);
    console.timeEnd('solution1');
    
    console.time('solution2');
    await solution2(locations);
    console.timeEnd('solution2');
    

    假设 insertDB 花费 100ms ~ 200ms, avg = 150ms
    解决方案 1:
    运行循环 1,等待 insertDB -> 运行循环 2,等待 insertDB
    时间 = 150 毫秒 + 150 毫秒 = 300 毫秒
    解决方案 2:
    运行循环 1,无需等待 insertDB -> 运行循环 2,无需等待 insertDB
    直到所有 insertDB 完成,然后解决
    时间 = 150 毫秒
    因为所有 insertDB 都无需等待另一个 insertDB 即可启动
    信用:https://stackoverflow.com/a/56993392/13703967


    测试:https://codepen.io/hjian0329/pen/oNxdPoZ

    【讨论】:

    • 我想要的就像我有 1000 个请求,我有 10 个人,想把这 1000 个请求交给这 10 个人,这样我就可以完成第 1000 个请求。
    • 我认为您正在寻找多线程。太糟糕了,我以前没有尝试过。经过一番搜索,您可以阅读以下内容blog.logrocket.com/…
    • 顺便说一句,与您的第一个解决方案相比,我上面的答案应该具有更好的性能。根据stackoverflow.com/questions/56992054/…
    • 您的答案与示例 1 的解决方案没有太大区别。我仍然必须等待所有任务完成,然后才能将最终响应传递给用户。
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-02
    • 2021-04-03
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多