假如有几十个请求,如何去控制高并发?

公司项目中做图片或文件批量下载,每次下载都是大批量的,那么假如我一次性下载几十个,如何去控制并发请求的?
让我想想,额~, 选中ID,循环请求?,八嘎!肯定不是那么沙雕的做法,这样做服务器直接崩溃啦!后台立马从北京飞来干掉我,突然灵光一现,请求池!!!
利用Promise模拟任务队列,从而实现请求池效果。

废话不多说,正文开始:

众所周知,浏览器发起的请求最大并发数量一般都是6~8个,这是因为浏览器会限制同一域名下的并发请求数量,以避免对服务器造成过大的压力。

首先让我们来模拟大量请求的场景

const ids = new Array(100).fill('')console.time()
for (let i = 0; i < ids.length; i++) {console.log(i)
}
console.timeEnd()

结果

一次性并发上百个请求,要是配置低一点,又或者带宽不够的服务器,直接宕机都有可能,所以我们前端这边是需要控制的并发数量去为服务器排忧解难。

什么是队列?

先进先出就是队列,push一个的同时就会有一个被shift。我们看下面的图就会更加的理解:

我们接下来的操作就是要模拟上图的队列行为。

定义请求池主函数函数
export const handQueue = (  reqs // 请求数量
) => {}

接受一个参数reqs,它是一个数组,包含需要发送的请求。函数的主要目的是对这些请求进行队列管理,确保并发请求的数量不会超过设定的上限。

定义dequeue函数
const dequeue = () => {  while (current < concurrency && queue.length) {  current++;  const requestPromiseFactory = queue.shift() // 出列  requestPromiseFactory()  .then(() => { // 成功的请求逻辑  })  .catch(error => { // 失败  console.log(error)  })  .finally(() => {  current--  dequeue()  });  }  
}

这个函数用于从请求池中取出请求并发送。它在一个循环中运行,直到当前并发请求数current达到最大并发数concurrency或请求池queue为空。对于每个出队的请求,它首先增加current的值,然后调用请求函数requestPromiseFactory来发送请求。当请求完成(无论成功还是失败)后,它会减少current的值并再次调用dequeue,以便处理下一个请求。

定义返回请求入队函数
return (requestPromiseFactory) => {  queue.push(requestPromiseFactory) // 入队  dequeue()  
}

函数返回一个函数,这个函数接受一个参数requestPromiseFactory,表示一个返回Promise的请求工厂函数。这个返回的函数将请求工厂函数加入请求池queue,并调用dequeue来尝试发送新的请求,当然也可以自定义axios,利用Promise.all统一处理返回后的结果。

const enqueue = requestQueue(6) // 设置最大并发数
for (let i = 0; i < reqs.length; i++) {  // 请求enqueue(() => axios.get('/api/test' + i))  
}

我们可以看到如上图所示,请求数确实被控制了,只有有请求响应成功的同时才会有新的请求进来,极大的降低里服务器的压力,后端的同学都只能喊6

整合代码
import axios from 'axios'export const handQueue = (reqs // 请求总数
) => {reqs = reqs || []const requestQueue = (concurrency) => {concurrency = concurrency || 6 // 最大并发数const queue = [] // 请求池let current = 0const dequeue = () => {while (current < concurrency && queue.length) {current++;const requestPromiseFactory = queue.shift() // 出列requestPromiseFactory().then(() => { // 成功的请求逻辑}).catch(error => { // 失败console.log(error)}).finally(() => {current--dequeue()});}}return (requestPromiseFactory) => {queue.push(requestPromiseFactory) // 入队dequeue()}}const enqueue = requestQueue(6)for (let i = 0; i < reqs.length; i++) {enqueue(() => axios.get('/api/test' + i))}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/18209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中Undo-log是什么?有什么作用?

2.6.1. Undo-log撤销日志 Undo即撤销的意思&#xff0c;通常也称为回滚日志&#xff0c;用来给MySQL撤销SQL操作的。 当一条写入类型的SQL执行时&#xff0c;都会记录Undo-log日志&#xff0c;Undo-log并不存在单独的日志文件&#xff0c;InnoDB默认是将Undo-log存储在xx.ibd…

利用基于CNN的人员检测与关键词识别的TinyML实现无接触电梯

目录 说明 论文概述 摘要 引言 现有非接触式电梯解决方案 新解决方案的需求 tinyML实施 系统构建和算法管道 CNN和TinyML实现 结果与讨论 结论 视频演示和代码可用性 一点感想 说明 我一直使用Google Schloar订阅最新的论文消息&#xff0c;今天看到一篇论文的标…

MR混合现实情景实训教学系统在临床医学课堂上的应用

MR混合现实情景实训教学系统在临床医学课堂上的应用可以带来许多积极的影响&#xff0c;具体表现在以下几个方面&#xff1a; 1. 增强教学的真实感和互动性&#xff1a;MR混合现实技术能够创建出高度逼真的模拟临床环境&#xff0c;使学生能够身临其境地体验临床实践。这种技术…

word快速公式教程

好文章分享 word快捷输入数学公式、word公式最详细介绍&#xff01;释放鼠标、代码大全&#xff01;&#xff01;&#xff01;&#xff08;小白也能学&#xff09; - 知乎

H6246 60V降压3.3V稳压芯片 60V降压5V稳压芯片IC 60V降压12V稳压芯片

H6246降压稳压芯片是一款电源管理芯片&#xff0c;为高压输入、低压输出的应用设计。以下是对该产品的详细分析&#xff1a; 一、产品优势 宽电压输入范围&#xff1a;H6246支持8V至48V的宽电压输入范围&#xff0c;使其能够适应多种不同的电源环境&#xff0c;增强了产品的通用…

2022ICPC(南京站)

I题 思路&#xff1a;这是一个签到题比较简单&#xff0c;只要判断出字符串中出现最多的字符&#xff0c;然后再让字符总数减去就行了 代码如下 //I #include<iostream> #include<algorithm> #include<string> #include<map> #define int long long…

统计本地端口占用情况

要查看MongoDB是否正在备份&#xff0c;可以通过以下几种方法&#xff1a; 查看MongoDB的进程列表&#xff1a; 使用命令ps -ef | grep mongo&#xff0c;这将列出所有正在运行的MongoDB进程。在输出的列表中&#xff0c;你可以查看是否有与备份相关的进程或任务正在运行。 查…

据阿谱尔APO Research调研显示,2023年全球汽车脚踏垫市场销售额约为52亿美元

根据阿谱尔 (APO Research&#xff09;的统计及预测&#xff0c;2023年全球汽车脚踏垫市场销售额约为52亿美元&#xff0c;预计在2024-2030年预测期内将以超过2.81%的健康成长率成长。 汽车脚垫&#xff0c;是放置在汽车、卡车、货车和 SUV 等车辆地板上的保护性覆盖物&#x…

网络安全技术心得体会

网络与信息安全技术心得体会 通过对网络安全这门课程的学习&#xff0c;我进一步了解了网络安全技术的相关知识。大致来说&#xff0c;所谓网络安全指的是对网络系统中各类软硬件和数据信息等提供保护屏障&#xff0c;确保数据信息不受到恶意侵入、窃取等破坏&#xff0c;保证…

记一次重定向问题(浏览器安全)解决

近期做单点登陆功能&#xff0c;本身应该是一个很简单的功能&#xff0c;却发生了意向不到的问题…让我们看下&#xff1a; 首先第三方给出的地址需要通过JWT框架获取token拼接后跳转&#xff0c;我这边为了方便首选肯定是考虑用response.sendRedirect(url)&#xff0c;但是做好…

基于朴素贝叶斯算法的微博舆情监控系统,flask后端,可视化丰富

背景&#xff1a; 微博作为中国最大的社交媒体平台之一&#xff0c;汇聚了海量用户生成的文本数据&#xff0c;承载着丰富的社会信息和舆论动向。随着互联网的快速发展&#xff0c;人们对于利用这些数据进行舆情分析和预测的需求日益增加。在这种情况下&#xff0c;以Python为…

OpenHarmony应用在DevEco Studio配置默认密钥为123456的签名如何进行一键签名

目录 一.背景知识 二.完成自动化操作 三.在DevEco Studio中配置自动化签名 一.背景知识 首先OpenHarmony的应用需要使用OpenH

Java实现图片保存到pdf的某个位置2

Java实现图片保存到pdf的某个位置2 1、依赖–maven <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</version></dependency>2、上代码 import org.apache.pdfbox.pdmode…

java多线程中的“任务取消“

概要 在使用 java 进行多线程开发时,任务和线程的启动很容易.大多数时候我们都会让它们运行直到结束,或者让它们自行停止.然而,有时候我们希望能提前结束任务或线程,或许时因为用户取消了操作,或者应用程序需要被快速关闭. 要使任务和线程能够安全/快速/可靠的停止下来,并不是…

Sui新共识协议刷新了区块链交易速度的标准

Sui是提供业界领先性能和无限水平扩展的创新Layer 1区块链&#xff0c;今日在官推上宣布其最新共识协议Mysticeti已成功部署到测试网。这一重大突破将Sui测试网的共识时间减少了80%&#xff0c;至390毫秒&#xff0c;同时保持协议的行业领先吞吐量。这一令人印象深刻的演示证明…

2024「618年中盛典」媒体邀约有哪些优惠活动?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 51媒体网2024年618 活动正式开启&#xff0c;也预示着2024传播季—年中盛典的到来&#xff0c;从即日起下单的客户&#xff0c;即可享受满减增等优惠政策&#xff0c;新客更享受折上折的…

模板编程中实现 SFINAE(Substitution Failure Is Not An Error)

在C模板编程中&#xff0c;std::enable_if 是一个常用的工具&#xff0c;它依赖于 SFINAE&#xff08;Substitution Failure Is Not An Error&#xff09;原则来控制模板的启用或禁用。理解 std::enable_if 如何工作&#xff0c;可以更清楚地看到为什么 disable_if_same_or_der…

Android plugin如何兼容App插件和library插件

Android插件的开发&#xff0c;在网上有很多资料&#xff0c;如&#xff1a;Android Gradle 插件开发入门指南&#xff1a;https://juejin.cn/post/6887581345384497165&#xff0c;最近由于工作需要&#xff0c;开发了一个jacoco与记录用例执行顺序的插件&#xff0c;整体功能…

【Python设计模式08】原型模式

原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过复制现有的对象来创建新的对象&#xff0c;而不是通过实例化类来创建对象。原型模式使得对象的创建更加灵活和高效&#xff0c;特别是在创建对象的过程复杂或代价高昂时。 原型模式的…

Clickhouse Bitmap 类型操作总结—— Clickhouse 基础篇(四)

文章目录 创建 Bitmap 对象Bitmap 转换为整数数组计算总数&#xff08;去重&#xff09;值指定start, end 索引生成子 Bitmap指定 start 索引和数量限制生成子 Bitmap指定偏移量生成子 Bitmap是否包含指定元素两个 Bitmap 是否存在相同元素一个是否为另一个 Bitmap 的子集求最小…