JavaScript async-pool实现控制并发请求原创

原创
小哥 3年前 (2022-10-20) 阅读数 7 #js教程
文章标签 JavaScriptasync-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) // 在所有任务完成后返回
        }

参考文档

JavaScript 如何在中实现并发控制?

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除