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

如何实现异步并发限制

如何实现异步并发限制

文章目录

  • 如何实现异步并发限制
    • 方法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('任务已全部执行');})

注意点

  1. 此时的 pool 代表的是:正在执行中的任务中的集合
  2. 使用 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

注意点

  1. pool 代表保存所有任务的数组
  2. count 代表当前正在执行任务的数目
  3. 保证顺序:需要从数组中顺序取出并执行

两个方法各变量代表的含义不同,实现的思路也就不同,要好好区分两种方法的思想,不然会混淆(像我一样☁️☁️☁️)


道阻且长,面试加油,边复习边查漏补缺吧!!!

passion!!!

http://www.lryc.cn/news/440362.html

相关文章:

  • 孙怡带你深度学习(2)--PyTorch框架认识
  • 如何在Android上实现RTSP服务器
  • 代理导致的git错误
  • Ready Go
  • Matlab simulink建模与仿真 第十三章(信号通路库)
  • Java中接口和抽象类的区别(语法层面的区别、设计理念层面的区别)
  • Leetcode面试经典150题-20.有效的括号
  • Git常用指令大全详解
  • 面试真题-TCP的三次握手
  • LabVIEW多语言支持优化
  • 身份证阅读器API模式 VUE Dorado7
  • 北京通州自闭症学校推荐:打造和谐学习氛围,助力孩子成长
  • openstack之cinder介绍
  • 第k个排列 - 华为OD统一考试(E卷)
  • 清理C盘缓存,电脑缓存清理怎么一键删除,操作简单的教程
  • 网络安全-ssrf
  • c++刷题
  • 艾丽卡的区块链英语小课堂
  • 计算机毕业设计 公寓出租系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • eclipse使用 笔记02
  • 基于C++实现(MFC)职工工作量统计系统
  • 大家好,我叫Redis~
  • 【鸿蒙】HarmonyOS NEXT星河入门到实战6-组件化开发-样式结构重用常见组件
  • 网络安全学习(五)Burpsuite
  • 多版本node管理工具nvm
  • 如何扫描试卷去除笔迹?4种方法还原整洁试卷
  • 介绍⼀下泛型擦除
  • 从底层原理上理解ClickHouse 中的 Distributed 引擎
  • 社区志愿者服务系统小程序的设计
  • echarts map地图动态下钻,自定义标注,自定义tooltip弹窗【完整demo版本】