如何实现API的3个并发请求:完成即补位的最优方案?
维持固定并发数处理API请求的最佳实现方式
你的当前代码是将产品分成每组3个,等待整组全部完成后再处理下一组,这会导致两组之间出现并发空窗期,无法做到"完成一个就立即补上一个"的效果。以下是实现固定3个并发请求的最优方案:
核心思路:使用Worker Pool(工作池)
创建3个异步工作函数,每个函数持续从任务队列中取出产品调用API,直到队列清空。这样就能始终保持最多3个并发请求,一个完成后立刻启动下一个。
改进后的代码
const productsQuery = await getAllProducts(); const allProducts = productsQuery.rows; const concurrencyLimit = 3; // 创建任务队列(复制原数组避免修改原数据) const taskQueue = [...allProducts]; // 定义工作函数:持续从队列取任务执行 async function processTask() { while (taskQueue.length > 0) { const product = taskQueue.shift(); try { await callCustomAPI(product); // 可选:处理成功后的逻辑,比如记录日志 } catch (error) { // 可选:处理请求失败的情况,比如重试或记录错误 console.error(`处理产品${product.id}失败:`, error); } } } // 启动3个工作函数,等待所有任务完成 await Promise.all(Array.from({ length: concurrencyLimit }, processTask));
代码说明
- 任务队列:将所有待处理的产品放入队列,
shift()方法每次取出队列头部的产品(先进先出),JavaScript单线程特性保证该操作不会出现竞争问题。 - 工作函数:每个工作函数循环从队列取任务,直到队列为空,完成一个请求后立即启动下一个,无缝填补并发空位。
- 并发控制:通过启动3个工作函数,严格维持最多3个API请求同时运行。
- 错误处理:
try/catch块避免单个请求失败导致整个工作线程终止,保证其他任务能继续执行。
对比原代码的优势
- 原代码是批量等待:必须等一组3个请求全部完成才会开始下一组,中间存在空闲时间。
- 新代码是持续并发:始终维持3个请求在运行,直到所有任务处理完毕,效率更高。
内容的提问来源于stack exchange,提问作者Mj Ebrahimzadeh
相关产品推荐
相关产品推荐

