并发请求控制

news2025/1/21 16:26:22

在这里插入图片描述

Chrome 浏览器最多并发6个请求。一般情况下,我们都会设置并发数为 3。

并发请求控制主要有两种区别:假设并发数为 3

  1. 三个请求为一组进行并发,这三个请求全部完成了,再进行下一组。
  2. 在第一种方式的基础上加上滑动补位,第一组三个请求,当其中一个请求完成,后续第4个请求,迅速补上发起请求。

这两种方式,第一种压根不是并发请求,准确说应该是并发发起请求。第二种有了滑动补位,才能说是一直以最大并发数在进行请求流程。

实现并发控制的核心:await Promise,将异步变同步

/**
 * 并发请求控制
 * @param {Function[]}requestArr 请求函数组成的数组
 * @param {number}limit 并发数量,默认为 3
 * @returns {Promise<any>[]} 每个请求的 promise 组成的数据
 */
export async function controlConcurrency(
    requestArr: ((...args: any[]) => Promise<any>)[],
    limit: number = 3
): Promise<any>[] {
    // 如果并发数小于等于0,抛出错误
    if (limit <= 0) throw new Error("并发限制必须大于0");

    const results: Promise<any>[] = []; // 结果数组
    const running: Promise<any>[] = []; // 并发数组

    // 遍历请求数组
    for (const request of requestArr) {
        // 调用请求函数,返回一个Promise
        const promise = request();

        // 将Promise添加到结果数组
        results.push(promise);

        // 将Promise添加到并发数组
        running.push(promise);

        // 如果并发数组的长度大于限制数,则等待running数组中最先完成的promise
        if (running.length >= limit) {
            await Promise.race(running);
        }

        // 每次Promise完成,从并发数组中移除
        promise.finally(() => {
            const index = running.indexOf(promise);
            if (index !== -1) running.splice(index, 1);
        });
    }

    // 返回所有Promise的结果
    return results;
}

测试代码:

const requestsArr = []

for (let index = 0; index < 10; index++) {
  requestsArr[index] = () => fetch('http://localhost/user')
}

controlConcurrency(requestsArr, 2).forEach(item => {
	item.then(response => {
	    response.json().then(res => {
	      	console.log(res);
	    })
  	})
  	.catch(err => {
	  	console.log(err);
	})
})

测试接口:

const express = require('express')

const app = new express()

// 跨域
app.all('*', function (req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  res.header('Access-Control-Allow-Methods', '*');
  res.header('Content-Type', 'application/json;charset=utf-8');
  next();
});

function getRandom() {
  return Math.floor(Math.random() * 10) + 1
}

app.get('/user', (req, res) => {
  const d = getRandom()
  // 随机延迟响应
  setTimeout(() => {
    res.json({time: d}) 
  }, d * 500)
})


app.listen(80, ()=> {
  console.log("express server running at http://127.0.0.1:80")
})

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

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

相关文章

Express框架开发接口之前台分类导航

1.初始化 const handleDB require(../handleDB/index) // 获取全部导航 exports.allNav (req, res) > {(async function () {})() } // 更新或者添加导航 exports.upNav (req, res) > {(async function () {})() } // 根据id删除 exports.delNav (req, res) > {(a…

Mac电脑风扇控制推荐 Macs Fan Control Pro 中文 for mac

Macs Fan Control Pro是一款功能全面、易于使用且具有良好兼容性和安全性的风扇控制软件&#xff0c;适用于各种Mac用户。 除了能够调整风扇速度外&#xff0c;Macs Fan Control Pro还支持实时监测硬件传感器的温度&#xff0c;例如CPU、硬盘等&#xff0c;同时显示每个传感器…

SpringBoot系列之自定义Jackson对象映射器格式日期数据

开发环境 JDK 1.8SpringBoot2.2.1Maven 3.2Mysql5.7.36开发工具 IntelliJ IDEAsmartGit 背景 在我之前的博客中&#xff0c;有对Springboot2.0集成Mybatis Plus做了比较详细的描述&#xff0c;现在这篇博客介绍&#xff0c;基于开源的jackson api来自定义ObjectMapping&…

MPLAB X IDE 仿真打断点提示已中断的断点?

这种中间带裂缝的是无效断点。 原因可能与XC编译器的优化有关&#xff0c;最后生成的汇编与C语言并不是一一对应的(官方给的解释是效率高)。所以这一行C语言转换的汇编代码可能并不在这个位置&#xff0c;也可能与其它汇编合并后根本就没有 我的解决方法是把优化等级调到最低&a…

【多线程面试题二十二】、 说说你对读写锁的了解

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说说你对读写锁的了解 …

windows server 2016调优

1. 增加TCP连接的最大数量&#xff1a; 在您当前的注册表路径&#xff08;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters&#xff09;中的右侧窗格&#xff0c;右击空白处&#xff0c;选择“新建” -> “DWORD (32位) 值”。为新的值命名为TcpNu…

Python:PDF转长图像和分页图像

简介&#xff1a;随着电子化文档的普及&#xff0c;PDF文件的使用频率越来越高。有时我们需要将PDF中的内容转化为图片格式进行分享或编辑&#xff0c;那么如何才能轻松地完成此任务呢&#xff1f;本文将为你展示一个Python工具&#xff1a;如何将PDF文件转化为图片&#xff0c…

Macroscope安全漏洞检测工具简介

学习目标&#xff1a; 本介绍旨在帮助感兴趣者尽快了解 Macroscope&#xff0c;这是一款用于安全测试自动化和漏洞管理的企业工具。 全覆盖应用程序安全测试&#xff1a; 如下图所示&#xff0c;如果使用多种互补工具&#xff08;SAST/DAST/SCA 等&#xff09;来检测应用程序…

redis的两种持久化的方式 RDB AOF

1. RDB持久化 就是将某个时间点的数据快照&#xff0c;全部保存在磁盘的二进制文件中。 可以选择命令手动触发&#xff1a; save命令&#xff0c;阻塞式保存快照数据&#xff0c;会阻塞其它操作 bgsave&#xff0c;开启子线程执行RDB 或者配置文件配置自动触发&#xff1a; 在r…

C#中只能在.NetFramework下使用LINQtoSQL不要在.net 下使用

目录 一、在net7.0下无法实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 二、在.NetFramework4.8下成功实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 三、结论 四、理由 本文是个人观点&#xff0c;因为我百般努力在.net7.0下无法实现LINQtoSQL的…

走近Python爬虫(二):常见反爬虫机制的应对措施

文章目录 一、应对—异步加载1.一般措施2.Selenium 二、应对—登录验证1.使用Selenium模拟登录2.使用Cookies登录3.使用Session模拟表单登录 三、应对—验证码 本文是Python爬虫系列博客的第二篇&#xff0c;内容概览如下&#xff1a; 一、应对—异步加载 1.一般措施 AJAX技术…

【操作系统】Cygwin和MinGW的区别与联系是怎样的?

Cygwin和MinGW的区别与联系是怎样的&#xff1f; CygwinMinGW两者的区别和联系参考资料 Cygwin和MinGW都是为Windows系统开发者设计的工具。 Cygwin Cygwin&#xff0c; 原Cygnus出品&#xff0c;目前是RedHat名下的项目。项目的目的是提供运行于Windows平台的类Unix环境&…

Linux - 浅析守护进程的概念

Linux下的守护进程是在后台运行的特殊进程&#xff0c;它不与任何终端关联&#xff0c;通常在系统启动时自动启动&#xff0c;运行在后台并且不受用户登录或注销的影响。Linux 下的守护进程通常是以系统管理员的权限运行&#xff0c;用来执行一些系统任务&#xff0c;例如监控硬…

MATLAB R2023b(编程和数学计算软件)

MATLAB R2023b是一款最新版本的编程和数学计算软件&#xff0c;它包含了大量用于算法开发、数据可视化、数据分析、数据模拟以及交互式环境的功能&#xff0c;使得用户能够更加方便灵活地进行科学研究或者工程应用。 MATLAB R2023b相较于之前的版本&#xff0c;增加了一些新的…

同城售后系统退款业务重构心得 | 京东云技术团队

一、重构背景 1.1、退款 到家、小时购、天选退款有2套结构&#xff0c;代码逻辑混乱&#xff1b; 其中小时购、天选部分售后单是和平生pop交互退款&#xff0c;部分是和售后中台交互退款&#xff1b;并且兼容3套逻辑&#xff1b; 痛点&#xff1a;代码繁重&#xff0c;缺乏…

猫头虎博主:Python数据分析,你掌握了吗?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

自动驾驶的同学看过来:DriveLM:世界首个语言+自动驾驶全栈开源数据集

DriveLM&#xff1a;世界首个语言自动驾驶全栈开源数据集&#xff0c;旨在借助大语言模型和海量自然语言数据集&#xff0c;构筑复杂场景下安全、精准、可解释的自动驾驶系统&#xff0c;突破现有自动驾驶推理能力上限&#xff0c;数据集已开源&#xff01; DriveLM提供了量化…

多叉树OJ思路 ,无代码

也是第一次写森林树&#xff0c;确实不是很拿捏&#xff0c;受二叉树的影响太多了&#xff1b;你会发现这个多叉树一般不建链式结构的&#xff0c;都是数组式的比如“双亲表示法”&#xff0c;让子节点可以找到父节点这样。 有疑问欢迎交流&#xff0c;作者我也是蒟蒻&#xff…

精进·第2篇:分享一个3-5年战略规划框架思路

首发&#xff1a;麦子禾咨询 作者&#xff1a;石头 前几天&#xff0c;石头分享过一个简单的战略规划框架思路&#xff0c;本篇&#xff0c;石头打算再分享一个相对复杂的3-5年战略规划框架思路。 每种战略规划框架思路&#xff0c;都有其局限性&#xff0c;有些受限于行业属…

MySQL 外连接和内连接的查询优化怎么做?

目录 1. 表连接方式的分类和需要注意的细节 2. 表连接时底层做了什么事&#xff1f; 3. 左外连接优化方案 4. 内连接优化方案 1. 表连接方式的分类和需要注意的细节 多表连接查询&#xff0c;大体上可以分为内连接与外连接。 内连接的意思就是把两个表有关联的部分都取出…