JS手写最大并发控制实现方式(主要针对类HTTP大量请求问题)

该博客介绍了一个名为`concurrentPoll`的函数,用于管理并限制并发执行的HTTP请求,防止因请求过多导致内存溢出。通过设置最大并发数和任务队列,该函数能够在达到最大并发数时暂停新任务,待当前任务完成后继续执行队列中的任务,确保系统的稳定运行。
摘要由CSDN通过智能技术生成
/**
 * 此问题目的为了解决类似http请求的并发量过大导致内存可能溢出的问题。
 */
function concurrentPoll() {
    this.tasks = []; // 任务队列
    this.max = 10; // 最大并发数
    // 函数主体执行完后立即执行,由于setTimeout是macrotask(宏任务),promise是microtask(微任务)
    // 所以,addTask方法添加的函数会优先执行
    setTimeout(() => {
        this.run()
    }, 0)
}

concurrentPoll.prototype.addTask = function (task) { // 原型添加任务方法
    this.tasks.push(task)
}
concurrentPoll.prototype.run = function () { // 原型任务运行方法
    if (this.tasks.length == 0) { // 判断是否还有任务
        return
    }
    const min = Math.min(this.tasks.length, this.max); // 取任务个数与最大并发数最小值
    for (let i = 0; i < min; i++) {
        this.max--; // 执行最大并发递减
        const task = this.tasks.shift(); // 从数组头部取任务
        task().then((res) => { // 重:此时可理解为,当for循环执行完毕后异步请求执行回调,此时max变为0
            console.log(res)
        }).catch((err) => {
            console.log(err)
        }).finally(() => { // 重:当所有请求完成并返回结果后,执行finally回调,此回调将按照for循环依次执行,此时max为0.
            this.max++; // 超过最大并发10以后的任务将按照任务顺序依次执行。此处可理解为递归操作。
            this.run();
        })
    }
}
const poll = new concurrentPoll(); // 实例
for (let i = 0; i < 13; i++) { // 数据模拟
    poll.addTask(function () {
        return new Promise(
            function (resolve, reject) {
                // 一段耗时的异步操作
                resolve(i + '成功') // 数据处理完成
                // reject('失败') // 数据处理出错
            }
        )
    })
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值