首页 > 其他分享 >直播app开发,想实现并发控制看这里

直播app开发,想实现并发控制看这里

时间:2024-08-17 09:27:42浏览次数:3  
标签:const executing app ret 并发 直播 Promise array

直播app开发,想实现并发控制看这里

并发控制的概念相信大家都非常熟悉,比如浏览器请求的并发控制等。今天,我们结合 async-pool 这个开源工具来看看如何在直播app开发时,实现一个简单的并发控制。

async-pool 的代码分为 es6 和 es7 两个版本,都非常简单,我们主要基于 es6 版本进行说明。

在去除参数校验等逻辑以后,核心代码如下,非常短小精悍:

function asyncPool(poolLimit, array, iteratorFn) {
  let i = 0;
  const ret = [];
  const executing = [];
  const enqueue = function() {
    if (i === array.length) {
      return Promise.resolve();
    }
    const item = array[i++];
    const p = Promise.resolve().then(() => iteratorFn(item, array));
    ret.push(p);

    let r = Promise.resolve();

    if (poolLimit <= array.length) {
      const e = p.then(() => executing.splice(executing.indexOf(e), 1));
      executing.push(e);
      if (executing.length >= poolLimit) {
        r = Promise.race(executing);
      }
    }

    return r.then(() => enqueue());
  };
  return enqueue().then(() => Promise.all(ret));
}

 

asyncPool 支持三个参数,第一个是并发数量,第二个是一组请求输入,第三个是返回 promise 的迭代函数。我们举一个例子来进行说明。

假设我们现在有 500 个请求需要发送,并发数量控制是 50。那么我们可以这样使用 asyncPool:

asyncPool(50, [/* 500 个请求的参数数据 */], () => {/* 发起请求的函数 */})

 

我们现在来详细说明 asyncPool 的工作原理。

首先,asyncPool 中初始化了两个数组,ret 保存返回结果,其顺序要与输入顺序一致,executing 用于记录当前正在执行的请求。

asyncPool 中创建了一个 enqueue 函数,负责具体的并发控制逻辑。

在 enqueue 函数中,通过变量 i 来逐个获取请求输入参数,调用迭代函数发起请求,然后将返回的 promise 保存在 ret 中。

const item = array[i++];
const p = Promise.resolve().then(() => iteratorFn(item, array));
ret.push(p);

 

之后就是并发数量控制的核心逻辑:

let r = Promise.resolve();

if (poolLimit <= array.length) {
    const e = p.then(() => executing.splice(executing.indexOf(e), 1));
    executing.push(e);
    if (executing.length >= poolLimit) {
        r = Promise.race(executing);
    }
}

return r.then(() => enqueue());

 

如果并发数量限制大于要发起的请求数量,则无需通过 executing 数组来记录正在执行的请求,直接循环发起请求即可。

如果并发数量限制小于要发起的请求数量,则首先通过之前调用迭代函数返回的 promise 生成一个新的 promise,放入 executing 中。在这个新的 promise 完成时,将其从 executing 中删除。

如果 executing 数组长度大于并发数量控制,则使用 Promise.race(executing) 获取最先返回的 promsie,并通过它进行下一次迭代。

通过变量 r 我们可以看到,在整个循环过程中,enqueue 函数会形成一个 promise 链,在最后一个 promise 返回之后,asyncPool 通过 Promise.all 将所有的结果返回。

return enqueue().then(() => Promise.all(ret));

 

至此,async-pool 的核心逻辑我们就分析完了。上面的分析过程是基于 es6 版本的代码,es7 版本更加简洁,如下,看官们可以自行分析:

async function asyncPool(poolLimit, array, iteratorFn) {
  const ret = [];
  const executing = [];
  for (const item of array) {
    const p = Promise.resolve().then(() => iteratorFn(item, array));
    ret.push(p);

    if (poolLimit <= array.length) {
      const e = p.then(() => executing.splice(executing.indexOf(e), 1));
      executing.push(e);
      if (executing.length >= poolLimit) {
        await Promise.race(executing);
      }
    }
  }
  return Promise.all(ret);
}

 

我们知道,不管是 Promise.race 还是 Promise.all,只要有一个 promise 达到 Fufilled 或者 Rejected 状态,整个就会返回。这在接口请求的的场景中是不合适的。我们应该如何改造呢?

其实也非常简单,只要在迭代函数的调用处做一些特殊处理即可。

iteratorFn(item, array).then(resp => resp).catch(error => error);

 

以上就是直播app开发,想实现并发控制看这里, 更多内容欢迎关注之后的文章

 

标签:const,executing,app,ret,并发,直播,Promise,array
From: https://www.cnblogs.com/yunbaomengnan/p/18364042

相关文章

  • 基于SpringBoot+Vue+uniapp的职业高中智慧作业试题系统源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 三.直播头像打印机游客无人直播插件搭建教程【头像打印机】
    本片主要讲解如何搭建和使用头像打印机这个组件。目前比较火的小玩法,适合无人或半无人直播基本搭建是比较简单的。按照步骤走就可以了支持头像随机打分的操作效果:现在直播的比较火的小玩法,适合无人直播 打开【头像打印机】这个功能 参数说明:触发类型:可以全部勾选......
  • 【云服务器介绍】选择指南 腾讯云 阿里云全配置对比 搭建web 个人开发 app 游戏服务器
     ​省流目录:适用于博客建站(2-4G)、个人开发/小型游戏[传奇/我的世界/饥荒](4-8G)、数据分析/大型游戏[幻兽帕鲁/雾锁王国]服务器(16-64G)1.京东云-专属活动 官方采购季专属活动地址:京东云-618采购季服务器活动专区https://3.cn/20bTC-5L京东云又双叒降价了!活动页大改,增加两个......
  • application.yml基础配置
    sa-token:#token名称(同时也是cookie名称)token-name:token#token有效期,单位s默认30天,-1代表永不过期#timeout:43200#token临时有效期(指定时间内无操作就视为token过期)单位:秒activity-timeout:43200#是否允许同一账号并发登录(为true时允许一起登......
  • 从零开始构建霸王餐返利APP的技术路线与挑战
    从零开始构建霸王餐返利APP的技术路线与挑战大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿!在电商领域,霸王餐返利APP作为一种新兴的商业模式,为用户提供了一种新的消费体验。本文将探讨从零开始构建此类APP的技术路线和面临的挑战。项......
  • 导购APP的技术架构与用户体验优化
    导购APP的技术架构与用户体验优化大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿!随着移动互联网的快速发展,导购APP已成为连接用户与商品的桥梁。本文将探讨导购APP的技术架构设计以及如何通过技术手段优化用户体验。技术架构概览导......
  • SSM-国外鞋服代购平台-97782(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP、爬虫、
    SSM国外鞋服代购平台摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,鞋服代购平台当然也不例外。代购平台是以实际运用为开发背景,运用软件工程原理和开发方法,采用Java技术构建的一个管理系统。整个开发过......
  • 计算机毕业设计django+vue家庭医疗资源互助APP【开题+程序+论文】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着科技的飞速发展和人们生活水平的提高,健康已成为现代社会关注的焦点。在家庭医疗领域,尤其是在偏远地区或紧急情况下,医疗资源的可及性往......
  • LiveGBS流媒体平台GB/T28181功能-获取GB28181接入的海康大华宇视华为摄像头硬件NVR设
    @目录1、背景2、视频流媒体集成2.1、页面集成2.1、视频流地址播放集成3、页面集成说明3.1、直播分享页集成3.1.1、查看通道3.1.2、开启分享3.1.3、分享页面传参3.1.4、分享页面播放3.2、时间轴回放分享页集成3.3、电子地图分享页集成4、视频流地址播放集成说明4.1、获取直播流地......
  • [Java并发]Synchronized底层原理
    synchronized底层语义原理Java虚拟机中的同步(Synchronization)基于进入和退出管程(Monitor)对象实现。在Java语言中,同步用的最多的地方可能是被synchronized修饰的同步方法。同步方法并不是由monitorenter和monitorexit指令来实现同步的,而是由方法调用指令读取运行时......