登录
首页 >  文章 >  前端

并发控制中如何获取所有任务的请求结果?

时间:2024-12-13 14:01:07 261浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习文章相关编程知识。下面本篇文章就来带大家聊聊《并发控制中如何获取所有任务的请求结果?》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

并发控制中如何获取所有任务的请求结果?

并发控制中逐个获取请求结果

在控制并发数的场景中,需要依次得到每个任务执行后的请求结果。本文将解决如何解决这个问题。

创建的并发控制池控制着并发数,但是需要修改代码逻辑以在循环中获取每个请求的结果。

问题根源

100 次循环同步执行,初始产生了 100 个并发任务。由于并发数控制为 5,只有前 5 个任务会被处理。其他 95 个任务的 promise 被丢弃,导致无法得到这些任务的结果。

解决方案

可以使用一个 map 来缓存每个 promise 的 resolve 和 reject 函数,确保所有任务的请求结果都可以被获取。

修改后的代码

const createPool = (task, { concurrency } = {}) => {
  let runningCount = 0;
  const pool = [];
  const promiseMap = new Map();

  return function (i) {
    return new Promise((resolve, reject) => {
      promiseMap.set(i, { resolve, reject });

      pool.push(() => task(i));

      function run() {
        while (pool.length && runningCount < concurrency) {
          const runTask = pool.shift();
          runningCount++;
          runTask()
            .then((val) => {
              const { resolve } = promiseMap.get(val);
              resolve(val);
            })
            .catch((e) => reject(e))
            .finally(() => {
              runningCount--;
              run();
            });
        }
      }
      run();
    });
  };
};

在修改后的代码中,promise 的 resolve 和 reject 函数在 map 中进行缓存。当任务执行完成后,可以从 map 中获取相应的函数并将其调用,从而得到请求结果。

使用该并发控制池,可以通过监听 promise 来逐个获取每个请求的结果,从而解决最初的问题。

今天关于《并发控制中如何获取所有任务的请求结果?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>