源码解析之p-limit(限制异步任务并发数量)

p-limit是一个用于限制异步任务并发数量的javascript库,可以有效地管理资源并避免系统负载过高

简单使用如下:

import pLimit from "p-limit"// 限制并发数量为2
const limit = pLimit(2)const delay = (ms) => {return new Promise(resolve => setTimeout(resolve, ms));
};const asyncTask1 = async () => {await delay(5000)console.log("输出任务1")
}const asyncTask2 = async () => {await delay(5000)console.log("输出任务2")
}const asyncTask3 = async () => {await delay(5000)console.log("输出任务3")
}const input = [limit(() => asyncTask1()), limit(() => asyncTask2()), limit(() => asyncTask3())]const result = await Promise.all(input)// 输出如下
输出任务1 // 5s后出现
输出任务2 // 5s后出现
输出任务3 // 10s后出现

源码实现其实也不复杂,主要使用了队列 + 变量来控制

import Queue from "yocto-queue";
import { AsyncResource } from "#async_hooks";export default function pLimit(concurrency) {// 参数判断if (!((Number.isInteger(concurrency) ||concurrency === Number.POSITIVE_INFINITY) &&concurrency > 0)) {throw new TypeError("Expected `concurrency` to be a number from 1 and up");}// 初始化队列const queue = new Queue();let activeCount = 0;const next = () => {// 当前执行数量减一activeCount--;// 如果队列里有的话继续取出执行if (queue.size > 0) {queue.dequeue()();}};const run = async (function_, resolve, arguments_) => {// 当前执行数量加一activeCount++;// 定义一个函数来异步执行用户传入的方法,并返回一个promiseconst result = (async () => function_(...arguments_))();// 回传result// 如果用户在外面定义了then方法或者Promise.all方法,都可以接收到resultresolve(result);// 等待 result Promise 完成// try...catch 是用于捕获异常// 这样的话即使出现异常程序也能继续执行下去try {await result;} catch {}next();};const enqueue = (function_, resolve, arguments_) => {// 把run函数加入队列// 并传入用户定义方法和参数queue.enqueue(AsyncResource.bind(run.bind(undefined, function_, resolve, arguments_)));// 异步(async () => {// This function needs to wait until the next microtask before comparing// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously// when the run function is dequeued and called. The comparison in the if-statement// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.await Promise.resolve();// 判断当前执行的函数数量是否小于并发数// 是的话出列执行if (activeCount < concurrency && queue.size > 0) {queue.dequeue()();}})();};// 暴露给用户的函数,返回一个Promise// 传入了resolve用于执行用户传递的函数之后回传给用户函数结果const generator = (function_, ...arguments_) =>new Promise((resolve) => {enqueue(function_, resolve, arguments_);});Object.defineProperties(generator, {// 正在运行的数量activeCount: {get: () => activeCount,},// 正在等待的数量pendingCount: {get: () => queue.size,},// 清除队列clearQueue: {value() {queue.clear();},},});return generator;
}

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

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

相关文章

【CSharp】ushort[]的IntPtr快速转换为ushort[]无符号短整型数组

【CSharp】ushort[]的IntPtr快速转换为ushort[]无符号短整型数组 1.背景2.代码1.背景 参考博客: 【CSharp】无符号短整型数组ushort[]转化为IntPtr https://blog.csdn.net/jn10010537/article/details/139278321?spm=1001.2014.3001.5501探测器/相机SDK获得是InPtr指针,它…

python自动化-自动化网络配置工具v2(可巡检,可批量配置)

在日常工作中遇到需要配置相同配置的场景&#xff0c;网络工程师一个个去登陆配置会让工作效率显得没那么高效。 但是随着科技发展&#xff0c;人们不断的学习&#xff0c;我们似乎可以使用一些软件或者脚本来帮助我们实现巡检任务或者配置任务。 今天我想给大家分享一款我自己…

阿里面试:NIO为什么会导致CPU100%?

在 Java 中总共有三种 IO 类型&#xff1a;BIO&#xff08;Blocking I/O&#xff0c;阻塞I/O&#xff09;、NIO&#xff08;Non-blocking I/O&#xff0c;非阻塞I/O&#xff09;和 AIO&#xff08;Asynchronous I/O&#xff0c;异步I/O&#xff09;&#xff0c;它们的区别如下&…

LeetCode刷题之HOT100之多数元素

2024/5/21 起床走到阳台&#xff0c;外面绵柔细雨&#xff0c;手探出去&#xff0c;似乎感受不到。刚到实验室&#xff0c;窗外声音放大&#xff0c;雨大了。昨天的两题任务中断了&#xff0c;由于下雨加晚上有课。这样似乎也好&#xff0c;不让我有一种被强迫的感觉&#xff0…

React-入门

React由Meta公司研发&#xff0c;是一个用于构建Web和原生交互界面的库 既可以写基于浏览器的应用&#xff0c;还可以写苹果和安卓的原生应用 优势 开发环境搭建 create-react-app是一个快速创建React开发环境的工具&#xff0c;底层是由Webpack构建&#xff0c;封装了配置细…

江协科技STM32学习-0 购买套件

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技STM32”视频的学习笔记&#xff0c;在这里会记录下江协科技STM32开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技STM32教学视频和链接中的内容。 引用&#xff1a; STM32入门教程-2023版 细致讲…

Servlet跳转404(解决)

1.解决无法跳转的404问题&#xff08;最根本&#xff0c;最重要&#xff09; 查看Project Structure&#xff0c;检查你的JDK版本不要选错版本&#xff1b; 2.页面跳转&#xff0c;url栏输入的是web.xml中的url-pattern内容&#xff0c;请仔细检查 3.关于配置信息Applicatio…

鸿蒙HarmonyOS开发:tabs结合tabContent实现底部tabBar导航栏页面布局

文章目录 一、组件介绍1、Tabs参数属性事件TabsController 2、子组件属性说明 二、基础示例1、基础顶部导航2、效果3、可以滚动导航栏2、效果 三、扩展示例自定义导航栏1、代码2、效果 一、组件介绍 Tabs组件的页面组成包含两个部分&#xff0c;分别是TabContent和TabBar。Tab…

【Pandas】数据处理方法

1.数据拆分 pandas.Series.str.extract() Series.str.extract(pat, flags0, expandTrue)[source]extract(提取) 参数 pat: 带分组的正则表达式。 flag: re模块中的标志&#xff0c;例如re.IGNORECASE&#xff0c;修改正则表达式匹配的大小写、空格等 expand: 默认为True&…

【重学C语言】十六、联合、枚举、面向对象编程

【重学C语言】十六、联合、枚举、面向对象编程 联合定义联合体使用联合体注意事项枚举枚举的定义为枚举常量指定整数值枚举的使用枚举的打印枚举的优势注意事项面向对象编程1. 结构体(Structs)2. 封装(Encapsulation)3. 继承(Inheritance)

iec61850通信协议是什么

EC 61850是国际电工委员会&#xff08;IEC&#xff09;制定的一个用于电力系统自动化的国际标准。该协议广泛应用于变电站自动化、配电网自动化和智能电网等领域&#xff0c;旨在实现不同设备和系统之间的互操作性和高效通信。本文将详细介绍IEC 61850通信协议的特点、架构、关…

力扣HOT100 - 138. 随机链表的复制

解题思路&#xff1a; class Solution {public Node copyRandomList(Node head) {if(headnull) return null;Node p head;//第一步&#xff0c;在每个原节点后面创建一个新节点//1->1->2->2->3->3while(p!null) {Node newNode new Node(p.val);newNode.next …

Linux “如何添加用户/组和修改用户/组”

我们首先要知道Linux中用户时必须的吗&#xff01;&#xff1f;&#xff1f;&#xff1f; 用户是标识计算机的资源归属的 一、所在位置 我们得知道所有用户保存账号或者密码的文件在哪里&#xff01;&#xff01;&#xff01; /etc/passwd >>>保存系统中全…

【原创 精华】渗透测试-信息收集

一切需要用到的软件均已备份到百度云和阿里云 没有链接的文件请在本地渗透工具文件夹或是 kali 里查看 能用 fofa 的尽量用 包括查 ip&#xff0c;端口扫描&#xff0c;子域名&#xff0c;蜜罐 子域名收集 工具 子域名挖掘机&#xff08;本地文件有&#xff09; 通过爆破…

Ovid医学库文献如何在家查找下载

今天讲的数据库是一个知名医学库——Ovid Ovid隶属于威科集团的健康出版事业集团&#xff0c;与LWW、Adis等公司属于姊妹公司。Ovid数据库在医学外文文献数据库方面占据绝对地位&#xff0c;目前已有包涵人文、科技等多领域数据库300个&#xff0c;其中80多个是生物医学数据库…

CTF解题技能之MISC基础

杂项介绍 Miscellaneous简称MISC&#xff0c;意思是杂项&#xff0c;混杂的意思。 杂项大致有几种类型&#xff1a; 1.隐写 2.压缩包处理 3.流量分析 4.攻击取证 5.其它 本篇主要介绍杂项基础题目的知识点以及解题思路。 0x00 文件类型识别 杂项题目主要是以文件附件作…

Mac免费软件推荐

1. iTerm2 - 功能强大的终端 iTerm2 是一个功能强大且灵活的终端仿真器&#xff08;可替代系统默认终端&#xff09;&#xff0c;适合需要在 macOS 上进行大量终端操作的用户。其丰富的功能和高可定制性使得 iTerm2 成为许多开发者和系统管理员的首选工具。无论是处理多个会话…

如何在vue2中使用tailwind

查看官方文档&#xff0c;不要去看过时的文章&#xff01; 使用官网推荐的第一个安装方法 Installation - Tailwind CSS vue版本&#xff1a;2.6.10 1. 安装tailwind的包 npm install -D tailwindcss npx tailwindcss init 2. tailwind.config.js 文件中的content是你需要…

[自动驾驶技术]-2 感知系统之传感器功能和网络方案

1 传感器功能 自动驾驶系统通常使用多种传感器来实现对车辆周围环境的全面感知&#xff0c;包括摄像头、雷达、激光雷达&#xff08;LiDAR&#xff09;、超声波传感器、惯性测量单元&#xff08;IMU&#xff09;和全球定位系统&#xff08;GPS&#xff09;。 以下是我们对这些…

深度神经网络介绍与实战

一、介绍 深度神经网络(Deep Neural Networks,DNNs)是一种强大的机器学习算法,被广泛应用于计算机视觉、自然语言处理、语音识别等领域。它是人工神经网络的一种扩展,包含多个隐藏层,每一层都由多个神经元组成。 与传统的机器学习算法相比,深度神经网络具有以下特点:…