欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 异步请求池控制同一时间并发

异步请求池控制同一时间并发

2025/4/26 17:04:30 来源:https://blog.csdn.net/qq_33144001/article/details/147517636  浏览:    关键词:异步请求池控制同一时间并发

Q:并发请求数量过大,会在短时间内发送大量的网络请求,并且占用大量的系统资源,可能会造成接口阻塞,浏览器卡死现象,怎么才能控制并发请求数量防止频繁渲染呢?

可以考虑使用异步请求池,来控制同一时间并发请求的数量,我们可以通过维护一个请求队列来实现:

class PromisePool {constructor(concurrency) {this.concurrency = concurrency;this.running = 0;this.queue = [];this.results = [];this.taskCallbacks = [];}onTaskDone(callback) {this.taskCallbacks.push(callback);return this;}add(...tasks) {const taskPromises = tasks.map(task => this.run(task))return Promise.all(taskPromises);}run(task) {return new Promise((resolve, reject) => {const warppedTask = async () => {try {const result = await task();this.results.push(result);this.taskCallbacks.forEach(cb => cb(result));resolve(result);} catch (error) {reject(error);} finally {this.running--;this.next();}}if (this.running < this.concurrency) {this.running++;warppedTask();} else {this.queue.push(warppedTask);}})}next() {if (this.queue.length > 0 && this.running < this.concurrency) {const task = this.queue.shift();this.running++;task();}}
}let pool = new PromisePool(3);const task = [() => new Promise(resolve => {setTimeout(() => {resolve('task1');}, 1000)}),() => new Promise(resolve => {setTimeout(() => {resolve('task2');}, 2000)}),() => new Promise(resolve => {setTimeout(() => {resolve('task3');}, 3000)}),() => new Promise(resolve => {setTimeout(() => {resolve('task4');}, 4000)}),() => new Promise(resolve => {setTimeout(() => {resolve('task5');}, 1000)}),() => new Promise(resolve => {setTimeout(() => {resolve('task6');}, 4000)}),() => new Promise(resolve => {setTimeout(() => {resolve('task7');}, 1000)}),
]

执行代码输出

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词