promise实现带最大并发数限制的任务队列,核心是通过调度逻辑控制promise创建时机与数量,维护运行中任务数不超过上限,可用手动计数、promisepool类、信号量或p-limit库实现。

用 Promise 实现带最大并发数限制的任务队列,核心是“维护一个运行中任务不超过上限的缓冲池”,而不是一次性全发出去。关键不在 Promise 本身,而在调度逻辑——控制 new Promise 的时机和数量。
用数组 + 计数器手动调度
最直观的方式:维护一个待执行任务列表、当前运行数、最大并发数。每次有任务完成,就从队列里取下一个执行。
- 定义 running = 0 记录当前正在 resolve/reject 的 Promise 数量
- 定义 max = 3 设定最大并发数
- 每次调用 add(task) 时,如果 running 就立即执行;否则推入 queue 等待
- 每个 Promise 结束后(无论成功失败),running-- 并尝试从 queue 取一个新任务执行
封装成可复用的 PromisePool 类
把上述逻辑封装成类,支持传入任务数组和并发数,返回一个 Promise,完成后才 resolve 全部结果(或按顺序/并行收集)。
- 构造函数接收 tasks: Array Promise
> 和 maxConcurrency: number - 内部用 results = [] 存结果,index = 0 指向下一个待执行任务下标
- run() 方法:只要还有任务且未超限,就 tasks[index++]().then(...).finally(() => run())
- 所有任务启动后,返回 Promise.all(results) 或用 Promise.allSettled 更健壮
用 async/await + 信号量(Semaphore)更清晰
引入轻量信号量概念,避免手动计数出错。一个 semaphore 控制“还能启动几个”。
- 定义 acquire() 返回 Promise,当计数 > 0 时立刻 resolve,同时计数减一;否则等待
- release() 计数加一,并唤醒一个等待者(可用 Promise.resolve() 配合队列实现)
- 每个任务执行前 await semaphore.acquire(),结束后 semaphore.release()
- 这样任务逻辑干净,调度逻辑隔离,也天然支持动态调整并发数
直接使用成熟库(如 p-limit)
生产环境推荐用经过验证的库,比如 p-limit,它体积小、无依赖、API 简洁:
- import limit from 'p-limit'
- const fn = limit(3) 创建一个最多并发 3 的控制器
- const promises = tasks.map(task => fn(() => task()))
- await Promise.all(promises) 即可安全执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











