当前位置: 首页 > news >正文

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

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)}),
]

执行代码输出

相关文章:

  • 记一次调用大华抓拍SDK并发优化
  • 多模态深度学习: 从基础到实践
  • 网络犯罪全球化,数字时代的跨国诈骗危机
  • 文件的读取操作
  • 7年经验的Java程序员的技术知识概览(及分阶段学习计划、资源推荐、职业发展建议)
  • Web Worker 线程通信
  • Vue回调函数中的this
  • 8. 深入Spring AI:自定义Advisor
  • 函数的定义与使用(python)
  • 十五、项目管理
  • Prometheus中部署Alertmanager
  • 基于 Python 的自然语言处理系列(85):PPO 原理与实践
  • 70.评论日记
  • Kubernetes in action-初相识
  • C++ 类及函数原型详解
  • 通过模仿学习实现机器人灵巧操作:综述(上)
  • 船舶参数(第一版)
  • 交叉熵损失函数:从信息量、熵、KL散度出发的推导与理解
  • 动态规划算法详解(C++)
  • 使用Tortoise-ORM和FastAPI构建评论系统
  • 外卖价格、速度哪家强?记者实测美团、饿了么、京东三大平台
  • 文旅部副部长饶权出任国家文物局局长
  • 蚂蚁财富28亿港元要约收购耀才证券,筹谋香港券商牌照
  • 为国出征指纹却无法识别?他刷新了我军在这一项目的最好成绩
  • 涉军民事案件类型日益增多,最高法新规明晰管辖争议问题
  • 民政部党组成员、中国老龄协会会长刘振国任民政部副部长