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

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

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

执行代码输出

http://www.xdnf.cn/news/2031.html

相关文章:

  • [官方IP] AXI Memory Init IP
  • GAEA情感坐标背后的技术原理
  • HashMap的源码解析
  • Gradle安装与配置国内镜像源指南
  • Jira、PingCode、Redmine等18款缺陷管理工具对比评测
  • 《深入理解计算机系统》阅读笔记之第七章 链接
  • 软件工程-进度管理-PERT图Gantt图
  • vc++ 如何调用poco库
  • 力扣面试150题--环形链表和两数相加
  • 攻克光纤液位传感器电磁干扰两大难题
  • 飞机会员日
  • Transformer(Trainer)和参数调优实践
  • 【Linux内核设计与实现】第三章——进程管理04
  • java网络原理4
  • 配合图解 SEG-SAM: Semantic-Guided SAM for Unified Medical Image Segmentation
  • 三格电子——如何解决工业场景中以太网设备布线不方便的问题
  • 海外红人营销+用户反馈闭环:2025跨境电商品牌持续优化策略
  • 【前缀和计算和+哈希表查找次数】Leetcode 560. 和为 K 的子数组
  • 特斯拉宣布启动自动驾驶网约车测试,无人出租车服务进入最后准备阶段
  • SIEMENS PLC程序解读 -Serialize(序列化)SCATTER_BLK(数据分散)
  • sherpa-ncnn:Linux(x86/ARM32/ARM64)构建sherpa-ncnn --语音转文本大模型
  • BIOS主板(非UEFI)安装fedora42的方法
  • ClickHouse 中`MergeTree` 和 `ReplicatedMergeTree`表引擎区别
  • 谈谈接口和抽象类有什么区别?
  • 从“干瞪眼“到精准唤醒:Java线程通信的打怪升级之路
  • Unity3D Lua集成技术指南
  • kubesphere 单节点启动 etcd 报错
  • 3、LangChain基础:LangChain Chat Model
  • 从FP32到BF16,再到混合精度的全景解析
  • 高等数学第二章---导数与微分(2.1~2.3)