/**
* 此问题目的为了解决类似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('失败') // 数据处理出错
}
)
})
}
JS手写最大并发控制实现方式(主要针对类HTTP大量请求问题)
最新推荐文章于 2024-03-22 08:30:00 发布
该博客介绍了一个名为`concurrentPoll`的函数,用于管理并限制并发执行的HTTP请求,防止因请求过多导致内存溢出。通过设置最大并发数和任务队列,该函数能够在达到最大并发数时暂停新任务,待当前任务完成后继续执行队列中的任务,确保系统的稳定运行。
摘要由CSDN通过智能技术生成