如何实现异步并发限制
如何实现异步并发限制
文章目录
- 如何实现异步并发限制
- 方法1
- 注意点
- 方法2
- 题目要求
- 实现方法
- 注意点
之前一直没有系统的去总结异步并发限制的实现思路,今天就来做个总结吧
方法1
只有一个变量
pool:代表正在执行中的任务中的集合
function sleep(name, timeOut) {return new Promise(resolve => {console.log(`${name}开始了`);setTimeout(() => {console.log(`${name}结束了`);resolve();}, timeOut);})}const tasks = [() => sleep(1, 1000),() => sleep(2, 2000),() => sleep(3, 3000),() => sleep(5, 6000),() => sleep(8, 8000),];async function parallelLimit(tasks, limit = 2) {// 正在执行中的任务的集合const pool = new Set();for (const task of tasks) {const promise = task();pool.add(promise);promise.then(() => pool.delete(promise));if (pool.size >= limit) {await Promise.race(pool);}}return Promise.all(pool);}parallelLimit(tasks).then(() => {console.log('任务已全部执行');})
注意点
- 此时的 pool 代表的是:正在执行中的任务中的集合
- 使用 Promise.race 这种方式不能保证执行顺序,若要求要按顺序执行,请看第二种方法
方法2
题目要求
要求实现 Scheduler 函数,完成异步并发限制数为2的功能,且需要保证执行顺序
const scheduler = new Scheduler(2);const timeout = (time) =>new Promise((resolve) => {setTimeout(resolve, time);});const addTask = (time, order) => {scheduler.add(() => timeout(time).then(() => console.log(order)))
}addTask(1000, '1')
addTask(500, '2')
addTask(300, '3')
addTask(400, '4')// 500ms时,2完成,输出2
// 800ms时,3完成,输出3
// 1000ms时,1完成,输出1
// 1200ms时,4完成,输出4
实现方法
function Scheduler(limit) {// 模拟队列,保存所有任务this.pool = [];// 当前正在执行任务的数目this.count = 0;this.add = function (fn) {this.pool.push(fn);this.run();}this.run = function () {if (this.pool.length && this.count < limit) {const task = this.pool.shift(); // 保证执行顺序this.count++;task().then(() => {this.count--;this.run();})}}
}const scheduler = new Scheduler(2);const timeout = (time) =>new Promise((resolve) => {setTimeout(resolve, time);});const addTask = (time, order) => {scheduler.add(() => timeout(time).then(() => console.log(order)))
}addTask(1000, '1')
addTask(500, '2')
addTask(300, '3')
addTask(400, '4')// 500ms时,2完成,输出2
// 800ms时,3完成,输出3
// 1000ms时,1完成,输出1
// 1200ms时,4完成,输出4
注意点
- pool 代表保存所有任务的数组
- count 代表当前正在执行任务的数目
- 保证顺序:需要从数组中顺序取出并执行
两个方法各变量代表的含义不同,实现的思路也就不同,要好好区分两种方法的思想,不然会混淆(像我一样☁️☁️☁️)
道阻且长,面试加油,边复习边查漏补缺吧!!!
passion!!!
相关文章:
如何实现异步并发限制
如何实现异步并发限制 文章目录 如何实现异步并发限制方法1注意点 方法2题目要求实现方法注意点 之前一直没有系统的去总结异步并发限制的实现思路,今天就来做个总结吧 方法1 只有一个变量 pool:代表正在执行中的任务中的集合 function sleep(name, t…...
孙怡带你深度学习(2)--PyTorch框架认识
文章目录 PyTorch框架认识1. Tensor张量定义与特性创建方式 2. 下载数据集下载测试展现下载内容 3. 创建DataLoader(数据加载器)4. 选择处理器5. 神经网络模型构建模型 6. 训练数据训练集数据测试集数据 7. 提高模型学习率 总结 PyTorch框架认识 PyTorc…...
如何在Android上实现RTSP服务器
技术背景 在Android上实现RTSP服务器确实是一个不太常见的需求,因为Android平台主要是为客户端应用设计的。在一些内网场景下,我们更希望把安卓终端或开发板,作为一个IPC(网络摄像机)一样,对外提供个拉流的…...
代理导致的git错误
问题: 今天在clone时出现如下错误: fatal: unable to access https://github.com/NirDiamant/RAG_Techniques.git/: Failed to connect to 127.0.0.1 port 10089 after 2065 ms: Couldnt connect to server真是让人感到奇怪!就在前天&#…...
Ready Go
本文首发在这里 温馨提示 XX年,指的是20XX年,后跟以前、以后之类,均包含本数链接较多,只是想言之有物,已拒绝相同外链,仅看关心的即可已尽量只引用自己的东西,16年后仓库(11/13),2…...
Matlab simulink建模与仿真 第十三章(信号通路库)
参考视频:simulink1.1simulink简介_哔哩哔哩_bilibili 一、信号通路库中的模块概览 1、信号通路组 注:部分模块在第二章中有介绍,本章不再赘述。 2、信号存储和访问组 二、总线分配模块 Bus Assignment模块接受总线作为输入,并…...
Java中接口和抽象类的区别(语法层面的区别、设计理念层面的区别)
文章目录 1. 语法层面的区别1.1 成员属性1.2 成员方法1.3 关系 2. 设计理念层面的区别(重点)3. 举例理解抽象类和接口在设计理念层面的区别3.1 例一:门和警报3.2 例二:招聘3.3 例三:装修房子 4. 总结 1. 语法层面的区别…...
Leetcode面试经典150题-20.有效的括号
给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…...
Git常用指令大全详解
Git常用指令大全详解 Git,作为目前最流行的分布式版本控制系统,其强大的功能和灵活性为开发者提供了极大的便利。无论是个人项目还是团队协作,Git都扮演着不可或缺的角色。本文将详细总结Git的常用指令,帮助大家更好地掌握这一工…...
面试真题-TCP的三次握手
TCP的基础知识 TCP头部 面试题:TCP的头部是多大? TCP(传输控制协议)的头部通常是固定的20个字节长,但是根据TCP选项(Options)的不同,这个长度可以扩展。TCP头部包含了许多关键的字…...
LabVIEW多语言支持优化
遇到的LabVIEW多语言支持问题,特别是德文显示乱码以及系统区域设置导致的异常,可能是由编码问题或区域设置不匹配引起的。以下是一些可能的原因及解决方案: 问题原因: 编码问题:LabVIEW内部使用UTF-8编码,但…...
身份证阅读器API模式 VUE Dorado7
VUE 新框架 // 身份证扫描 readIdCard(type) {// 1.连接axios.get(http://localhost:19196/openDevice).then(res > {if (res.data.resultFlag 0) {// 2.读卡axios.get(http://localhost:19196/readCard).then((res) > {if (res.data.resultFlag 0) {// this.$message…...
北京通州自闭症学校推荐:打造和谐学习氛围,助力孩子成长
在北京通州,寻找一所能够全面关注自闭症儿童成长、提供高效康复服务的学校,星贝育园无疑是众多家庭的首选。作为全国知名的广泛性发育障碍全托寄宿制儿童康复训练机构,星贝育园以其专业的康复方法、强大的师资力量和贴心的服务,为…...
openstack之cinder介绍
概念 cinder 为虚拟机提供管理块存储服务。支持的文件系统:lvm、iscsi、nfs、san、RBD 组件构成及功能介绍 cinder api:在控制节点运行,管理服务的接口,被命令行、其他组件调用; cinder scheduler:类似n…...
第k个排列 - 华为OD统一考试(E卷)
2024华为OD机试(E卷D卷C卷)最新题库【超值优惠】Java/Python/C合集 题目描述 给定参数n,从1到n会有n个整数:1,2,3,.,n,这n个数字共有 n!种排列。按大小顺序升序列出所有排列情况,并-一标记,当n3时,所有排列…...
清理C盘缓存,电脑缓存清理怎么一键删除,操作简单的教程
清理C盘缓存是维护电脑性能、释放磁盘空间的重要步骤。以下是一个详细且操作简单的教程,旨在帮助用户通过一键或几步操作完成C盘缓存的清理。 1.使用Windows系统自带工具 磁盘清理 1.打开磁盘清理工具: -按下“WinE”打开文件资源管理器…...
网络安全-ssrf
目录 一、环境 二、漏洞讲解 三、靶场讲解 四、可利用协议 4.1 dict协议 4.2 file协议 4.3 gopher协议 五、看一道ctf题吧(长亭的比赛) 5.1环境 5.2开始测试 编辑 一、环境 pikachu,这里我直接docker拉取的,我只写原…...
c++刷题
17.电话号码的组合 来源于题解思路: 继承 CC14 KiKi设计类继承 #include <iostream> #include <memory> using namespace std; class Shape{ private:int x;int y; };class Rectangle:public Shape { public:Rectangle(int length,int width):Shape…...
艾丽卡的区块链英语小课堂
系列文章目录 复习昨日 文章目录 系列文章目录前言1.opaque2.deduplicates3.references4,intermix5.serializing6.streamline7.robust8.flexibility9.exotic10.nevertheless11. realize12.flavor13.subtract14.attach15.award 前言 欢迎来到艾丽卡的区块链英语小课堂&#x…...
计算机毕业设计 公寓出租系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
Neo.mjs性能优化:如何实现每秒40,000+增量更新的秘密
Neo.mjs性能优化:如何实现每秒40,000增量更新的秘密 【免费下载链接】neo The application worker driven frontend framework 项目地址: https://gitcode.com/gh_mirrors/neo/neo Neo.mjs作为一款由应用工作器驱动的前端框架,以其卓越的性能表现…...
如何将 iPhone 实况照片传输到电脑:四种最佳方法
实况照片是一种有趣的拍摄形式,它不仅能捕捉静态画面,还能记录下带有动态和声音的短暂瞬间。轻按一张实况照片,它就会 “动起来”,还原拍摄时几秒的动态画面和现场声音。 如果你已经掌握了普通照片从 iPhone 传输到电脑的方法&…...
避开这5个坑!用MediaRecorder+Vue3实现高兼容性语音输入
Vue3MediaRecorder实战:5个关键技巧打造高兼容语音输入方案 在移动优先的时代,语音输入已成为提升用户体验的重要交互方式。但当你兴奋地在Vue3项目中集成MediaRecorder API时,可能会遇到iOS设备上的静默失败、Android机型上的格式兼容性问题…...
CVAT数据标注工具保姆级安装教程:从Docker部署到第一个标注任务
CVAT数据标注工具保姆级安装教程:从Docker部署到第一个标注任务 计算机视觉项目的成功往往始于高质量的数据标注。CVAT(Computer Vision Annotation Tool)作为英特尔开源的标注工具,凭借其丰富的标注类型支持和灵活的部署方式&am…...
HARMONYOS应用实例258:反比例函数图像
反比例函数图像 功能:绘制双曲线,点击图像上的点显示坐标,验证 xy=kxy=kxy=k 的恒等关系。 应用功能: 绘制反比例函数双曲线图像 y = k/x 可调节k值,范围从1到20...
bilibili-api完全指南:评论数据爬取的4个突破式解决方案
bilibili-api完全指南:评论数据爬取的4个突破式解决方案 【免费下载链接】bilibili-api 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。原仓库地址:https://github.com/MoyuScript/bilibili-api 项目地址: https://gitcode.com/gh_mi…...
基于Kubernetes Operator的MySQL InnoDB Cluster自动化部署实践
1. MySQL InnoDB Cluster与Kubernetes Operator基础 MySQL InnoDB Cluster是MySQL官方提供的高可用数据库解决方案,它基于MySQL Group Replication技术构建,能够实现多节点数据同步和自动故障转移。想象一下,这就像是一个由多个数据库实例组…...
ComfyUI翻译节点终极指南:如何选择最适合你的AI创作翻译工具
ComfyUI翻译节点终极指南:如何选择最适合你的AI创作翻译工具 【免费下载链接】ComfyUI_Custom_Nodes_AlekPet Custom nodes that extend the capabilities of Comfyui 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_Custom_Nodes_AlekPet 在AI图像生…...
如何突破思维导图协作瓶颈?云端协同与知识管理新方案
如何突破思维导图协作瓶颈?云端协同与知识管理新方案 【免费下载链接】kityminder 百度脑图 项目地址: https://gitcode.com/gh_mirrors/ki/kityminder 在数字化办公环境中,思维导图作为梳理思路、规划项目的重要工具,其价值已得到广泛…...
Ostrakon-VL-8B LaTeX文档自动化:将手写公式草图转换为排版代码
Ostrakon-VL-8B LaTeX文档自动化:将手写公式草图转换为排版代码 每次写论文或者报告,最头疼的部分是什么?对我而言,绝对是敲那些复杂的LaTeX公式。一个积分符号、一个分式结构,往往要花上好几分钟去回忆语法、调整括号…...
