JavaScript async-pool实现控制并发请求原创
原创什么是并发控制
假设有6我们希望限制同时执行的任务的数量,即E。最多只能2任务可以同时执行。当您执行任何任务列表时1任务完成后,程序将自动从待办任务列表中获取新的待办任务,并将该任务添加到正在执行的任务列表中。
图解



async-pool
本文使用 async-pool 库来实现并发控制
async-pool的使用
const timeout = i => new Promise(resolve => setTimeout(() => resolve(i), i))
await asyncPool (5,[1000,2000,3000,4000],timeout)
其中, asyncPool 是在窗体中实现并发控制的主函数
function asyncPool(poolLimit, array, iteratorFn){ ... }
参数介绍
poolLimit(Number):表示并发数量有限;array(Array):表示任务数组;iteratorFn(FunctionaAz):表示为每个任务项实现处理的迭代函数,该函数返回1。 Promise 对象或异步函数。
async-pool的实现
实施的核心是通过 Promise.all() 和 Promise.race() 配合
async function asyncPool (poolLimit,array,iteratorFn) {
const ret = [] // 存储所有异步任务
const executing = [] // 存储正在执行的所有任务
for (const item of array) {
const p = Promise.resolve().then(() => iteratorFn(item,array))
// 调用iteratorFn函数来创建异步任务
ret.push(p)
// 保存新的异步任务
if (poolLimit <= array.length) {
// 当poolLimit当任务总数小于或等于时,执行并发控制
const e = p.then(() => executing.splice(executing.indexOf(e),1))
// 任务完成后,从正在执行的任务队列中删除该任务以腾出空间
executing.push(e)
// 加入正在执行的异步任务
if (executing.length >= poolLimit) {
await Promise.race(executing)
// 任务执行完成后,进入下一个周期。
}
}
}
return Promise.all(ret) // 在所有任务完成后返回
}
参考文档
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除
itfan123




