当前位置: 首页 > 知识库问答 >
问题:

性能优化 - 并发控制Promise,但是时间却相同,求解答?

钱德元
2024-08-26

我自己写了一个控制最大并发数的promise,但是不知道为什么不管我是并发1个还是并发10个,最后执行的时间都一样,我觉得逻辑上没有问题,就是在promise完成后调用.then()方法然后开启下一个调用,目前找不出问题到底出在哪,有无大佬帮忙指出一下,感谢!

var createPromises = function (n) {
    return new Array(n).fill().map((_, index) => {
        return new Promise((res, rej) => {
            setTimeout(() => {
                res(`第${index + 1}个完成`)
            }, Math.floor(Math.random() * n))
        })
    })
}
var conPromise = function (promises, n) {
    let sumLen = promises.length
    return new Promise((res, rej) => {
        let retArr = [], retCount = 0
        for (let c = 0; c < n; c++) {
            goNext(retArr, c)
        }

        async function goNext(retArr, index) {
            if (promises.length === 0) {
                if (retCount === sumLen) {
                    res(retArr);
                }
                return;
            }
            promises.shift().then((val) => {
                retCount++
                retArr[index] = val
                let nextIndex = sumLen - promises.length
                goNext(retArr, nextIndex)
            }).catch(err => {
                rej(err)
            })
        }
    })
}


conPromise(createPromises(100), 10).then((retArr) => {
    console.log('并发返回结果��');
    retArr.forEach(r => {
        console.log(r);
    });
});

这是并发1个的
image.png

这是并发10个的
image.png

共有3个答案

孔君浩
2024-08-26

试下这个

var conPromise = function (promises, n) {
    let sumLen = promises.length;
    let inProgress = 0;
    let retArr = new Array(sumLen).fill(null);
    let currentIndex = 0;

    return new Promise((res, rej) => {
        function processNext() {
            if (currentIndex === sumLen) {
                if (inProgress === 0) {
                    res(retArr);
                }
                return;
            }
            while (inProgress < n && currentIndex < sumLen) {
                let index = currentIndex++;
                inProgress++;
                promises[index].then((val) => {
                    retArr[index] = val;
                }).catch(rej).finally(() => {
                    inProgress--;
                    processNext();
                });
            }
        }
        processNext();
    });
};
羿宏硕
2024-08-26

将 setTimeout 的延迟时间设置为一个固定的值,比如100毫秒,不要用随机数

贺栋
2024-08-26
@@ -1,9 +1,9 @@
 var createPromises = function (n) {
   return new Array(n).fill().map((_, index) => {
-      return new Promise((res, rej) => {
+      return () => new Promise((res, rej) => {
           setTimeout(() => {
               res(`第${index + 1}个完成`)
-          }, Math.floor(Math.random() * n))
+          }, 100)
       })
   })
 }
@@ -22,7 +22,7 @@ var conPromise = function (promises, n) {
               }
               return;
           }
-          promises.shift().then((val) => {
+          promises.shift()().then((val) => {
               retCount++
               retArr[index] = val
               let nextIndex = sumLen - promises.length
 类似资料:
  • 本文向大家介绍MongoDB性能优化及监控,包括了MongoDB性能优化及监控的使用技巧和注意事项,需要的朋友参考一下 MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 一、索引 MongoDB 提供了多样性

  • ANR ANR全称Application Not Responding,意思就是程序未响应。 出现场景 主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。 主线程中存在耗时的计算 主线程中错误的操作,比如Thread.wait或者Thread.sleep等 Android系统会监控程序的响应状况,一旦出现下面两种情况,则弹出ANR对话框 应用在5秒内未响应用户的输入事件(如按键或者触摸

  • 有许多因素影响你的 Web 应用程序的性能。有些是环境, 有些是你的代码,而其他一些与 Yii 本身有关。 在本节中,我们将列举这些因素并解释如何通过调整这些因素来提高应用程序的性能。 优化你的 PHP 环境 一个好的 PHP 环境是非常重要的。为了得到最大的性能, 使用最新稳定版本的 PHP。 PHP 的主要版本可能带来显著的性能提升。 启用字节码缓存 Opcache(PHP 5.5或更高版本)

  • 使用 YOG2 我们可以轻松的实现多种性能优化功能。 压缩 yog2 release --dest dev --optimize # 也可以使用等价缩写 yog2 release -od dev 压缩功能将会对 JavaScript, CSS, PNG 三种资源进行压缩。 MD5戳 在使用 fis 管理了静态资源后,我们可以通过开启 MD5 戳来实现静态资源的强缓存,关于 MD5戳的优点,可

  • 页面性能优化 桌面端性能优化 网络加载 减少 HTTP 请求次数; 减小 HTTP 请求大小; 将 CSS 或 JavaScript 放到外部文件中,避免使用标签直接引入; 避免页面中空的 href 和 src 属性; 为 HTML 指定 Cache-Control 或 Expires; 合理设置 Etag 和 Last-Modified; 减少页面重定向; 使用静态资源分域存放来增加下载并行数;

  • 当应用于数以百万计的用户或权限的生产环境时,您可能会在Casbin 的强制执行中遇到性能降级,通常有两个原因: 高访问量 每秒到来的请求数量非常庞大,例如:单个Casbin实例每秒就能收到10000条请求。 在这种情况下,仅靠一个Casbin实例通常难以处理完所有请求。 现在有两种解决方案: 运用多线程来运行多个Casbin实例,这样以来您就可以充分利用机器中的所有内核。 详情请参阅:多线程 将C

  • imi 为性能做了以下努力: 框架核心运行时缓存 项目运行时缓存 热更新重启采用增量方式 数据库 Statement 复用 减少不必要的注入处理 使用框架核心运行时缓存+热更新重启采用增量方式,我们的实际项目原本重启需要 6 秒,现在只需几毫秒,提升可谓是巨大的。 使用项目运行时缓存后,每次启动和热重启worker进程时,硬盘读写压力不再巨大。 我们将持续为性能优化,为可靠性优化。 上面提到的框架

  • 问题内容: 我是性能优化的新手,虽然我认识到nodejs可能不是最适合初学者的地方,但这是手头的任务。 观察结果:在没有负载且数据库中的用户少于10个的登台服务器上,简单JSON API请求的时间约为数百毫秒。特别是,对/ api / get_user的调用大约需要300毫秒 执行以下代码: (注意:我们将会话存储在Redis中) 堆栈: Nodejs Express Redis Mongo 我从