Nodejs,除了使用 async 模块来控制并发数量,还有别的方式吗?

发布于 1周前 作者 gougou168 来自 nodejs/Nestjs

Nodejs,除了使用 async 模块来控制并发数量,还有别的方式吗?

async 模块中有 mapLimit 函数可以完成这个任务,请问各位老司机还有别的方法可以完成这个任务吗?不一定是别的包 /模块,也可以是别的思路。

3 回复

node 的 stream 不是自动管理 back pressure 吗?


在 Node.js 中,除了使用 async 模块来控制并发数量,确实还有其他几种常见的方法可以实现并发控制。以下是几种主要的方法:

  1. 使用 Promise.allSettled 和手动控制并发: 你可以手动管理一个并发任务队列,通过 Promise.allSettled 来等待一定数量的任务完成后,再启动新的任务。

    const maxConcurrent = 3;
    let queue = [];
    let running = 0;
    
    function processQueue() {
      if (running >= maxConcurrent || queue.length === 0) return;
      running++;
      const task = queue.shift();
      task().finally(() => {
        running--;
        processQueue();
      });
    }
    
    function addTask(taskFunc) {
      queue.push(taskFunc);
      processQueue();
    }
    
    // 示例任务
    addTask(() => someAsyncTask());
    
  2. 使用第三方库 p-limitp-limit 是一个轻量级的库,用于限制 Promise 并发的数量。

    const pLimit = require('p-limit');
    const limit = pLimit(3); // 限制并发数量为3
    
    async function runTasks() {
      const tasks = [someAsyncTask1, someAsyncTask2, someAsyncTask3, ...];
      await Promise.all(tasks.map(task => limit(task)));
    }
    
    runTasks().then(() => console.log('All tasks done'));
    
  3. 使用 async.queue(来自 async 库的高级用法): 虽然你提到不想只用 async 模块,但 async.queue 是另一种值得提及的并发控制方法,它提供了队列管理和任务处理的完整解决方案。

这几种方法都可以有效地控制并发数量,根据具体需求选择适合你的方案即可。

回到顶部