码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 并发任务队列(字节青训测试题)


    需求描述

    封装一个并发任务队列类,用于对一些异步任务按指定的并发数量进行并发执行。

    /**
     * 延迟函数
     * @param {number} time - 延迟时间
     * @return {Promise} delayFn - 延迟函数(异步封装)
     */
    function timeout(time) {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve();
        }, time)
      });
    }
    
    // 并发任务队列,接收一个最大并发数量
    const concurrentTaskQueue = new ConcurrentTaskQueue(2);
    
    /**
     * 添加并发任务并按规则执行
     * @param {number} time - 延迟时间
     * @param {string} name - 任务名称
     */
    function addTask(time, name) {
      concurrentTaskQueue.add(() => timeout(time)).then(() => {
        console.log(`任务${name}完成`);
      })
    }
    
    addTask(1000, 1);
    addTask(1000, 2);
    addTask(1000, 3);
    addTask(1000, 4);
    addTask(1000, 5);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    实现

    // 并发任务队列
    class ConcurrentTaskQueue {
      constructor(concurrentCount) {
        this.concurrentCount = concurrentCount; // 并发数量
        this.tasks = []; // 任务队列
        this.runningCount = 0; // 正在执行的任务数量
      }
      // 添加任务
      add(task) {
        return new Promise((resolve) => {
          this.tasks.push({ task, resolve});
          this.handle(); // 添加完立即执行
        })
      }
      // 执行任务
      handle() {
        if (this.runningCount < this.concurrentCount && this.tasks.length > 0) {
          const { task, resolve} = this.tasks.shift(); // 取出任务
          this.runningCount++;
          task().then(resolve).finally(() => {
            this.runningCount--;
            this.handle(); // 执行完毕,并发数量有空余,再次调用
          })
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    SpringBoot使用@Async注解8大坑点
    网络安全系统性学习路线「全文字详细介绍」
    用DIV+CSS技术制作个人博客网站(web前端网页制作课期末作业)
    信息检索与数据挖掘 | (五)文档评分、词项权重计算及向量空间模型
    常用js库和框架(jsPlumb)
    无刷驱动设计——浅谈MOS驱动电路
    基于Spark的网上商城用户行为分析
    美国就业报告后美元小幅下跌 南非兰特走强
    蓝桥杯:真题讲解2(C++版)附带解析
    浏览器不能访问阿里云ECS
  • 原文地址:https://blog.csdn.net/Jackson_Mseven/article/details/133280363
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号