js实现一个异步锁,超时自动释放,队列等待

文章目录

  • 前言
  • 一、js实现
  • 二,使用
  • 总结


前言

异步锁是一种用于控制并发访问的锁机制,主要用于多线程/多任务环境下。异步锁允许多个任务并行执行,但是只允许一个任务在同一时间获取锁并执行临界区代码,其他任务需要等待该锁释放后才能获取锁并执行自己的临界区代码。

异步锁实现了互斥访问的机制,确保了同一时间只有一个任务可以访问共享资源。当一个任务获取了锁并执行临界区代码时,其他任务需要等待,直到锁被释放才能获取锁并执行自己的临界区代码。

异步锁的实现可以基于各种机制,如互斥量、信号量等。在使用异步锁时,需要注意避免死锁和活锁等并发访问问题,以确保程序的正确性和性能。

在许多编程语言和框架中,都提供了异步锁的内置支持或相关的库/工具,如Java的ReentrantLock、Python的asyncio.Lock等,开发者可以根据具体需求选择合适的异步锁实现。

一、js实现

编写lockUtils.js工具类

//简易异步锁对象,将异步任务变为并行运行
export class AsyncLock {constructor() {this.queue = [];this.isLocked = false;this.version = '0'}/*** 获取锁* @param {*} expire 锁过期时间*/async lock(expire) {// 如果锁已被占用,则将当前任务加入等待队列if (this.isLocked) {if (this.queue.length < 10) {await new Promise(resolve => this.queue.push(resolve));}else{return false}}this.isLocked = true;//生成锁版本号let version = generateUUId()this.version = version//如果300毫秒后没有主动释放锁,则自动释放if(!expire){expire = 300}setTimeout(() => {if (version == this.version && this.isLocked) {console.log("自动释放锁------------------")this.unlock();}}, expire);return true;}unlock() {// 如果有等待的任务,则从队列中取出一个并执行if (this.queue.length > 0) {const resolve = this.queue.shift();resolve();} else {this.isLocked = false;}}// 使用async函数包装锁的获取与释放,以简化外部使用async withLock(task) {let locked = await this.lock();if(locked){try {return await task();} finally {this.unlock();}}return locked}
}function generateUUId(){let d = new Date().getTime(); // 获取当前时间戳
/*   if (window.performance && typeof window.performance.now === "function") {d += performance.now(); // 使用high resolution timestamp if available} */const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {let r = (d + Math.random() * 16) % 16 | 0;d = Math.floor(d / 16);return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);});return uuid
}

二,使用

在异步方法中使用

let async = new AsyncLock()
async function test(){let lock = await async.lock()if (lock) {console.log('执行任务')}else {console.log('获取锁失败')}async.unlock()
}

获取不到锁会先添加道队列当中等待,如果队列满,或者则获取锁失败

总结

获取不到锁会先添加道队列当中等待,如果队列满,或者则获取锁失败。
并且可以设置锁超时时间,超过时间自动释放锁

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

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

相关文章

【力扣高频题】042.接雨水问题

上一篇我们通过采用 双指针 的方法解决了 经典 容器盛水 问题 &#xff0c;本文我们接着来学习一道在面试中极大概率会被考到的经典题目&#xff1a;接雨水 问题 。 42. 接雨水 给定 n 个非负整数&#xff0c;表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子…

java springboot中@OneToMany、@ManyToOne以及@ManyToMany讲解

在 Spring Boot 应用中&#xff0c;使用 JPA (Java Persistence API) 进行对象关系映射 (ORM) 时&#xff0c;OneToMany, ManyToOne, 和 ManyToMany 注解是用来定义实体之间的关联关系的。 下面详细介绍这些注解及其在 Spring Boot 中的应用。 1. ManyToOne ManyToOne 注解表…

Java-Redis-Clickhouse-Jenkins-MybatisPlus-Zookeeper-vscode-Docker-jdbc

文章目录 Clickhouse基础实操windows docker desktop 下载clickhousespringboot项目配置clickhouse Redis谈下你对Redis的了解&#xff1f;Redis一般都有哪些使用的场景&#xff1f;Redis有哪些常见的功能&#xff1f;Redis支持的数据类型有哪些&#xff1f;Redis为什么这么快…

流媒体技术

流媒体技术入门 在现代数字媒体环境中&#xff0c;流媒体技术已经成为音视频内容传输的主要形式。无论是直播、点播&#xff0c;还是视频会议&#xff0c;流媒体技术都为高效、低延迟的内容分发提供了强有力的支持。这篇博客将介绍什么是流媒体技术&#xff0c;流媒体的工作原…

第一个ffmpeg程序

在进行使用ffmpeg进行编写程序时&#xff0c;首先要记得进行注册设备&#xff08;avdevice_register_all &#xff09;&#xff0c;程序运行时&#xff0c;只需要注册一次就可以 avdevice_register_all 是 FFmpeg 多媒体处理库中的一个函数&#xff0c;其作用是注册所有可用的音…

【AI前沿】人工智能的历史演进

文章目录 &#x1f4d1;引言一、人工智能的起源与早期发展1.1 古代与早期的智能机器设想1.2 20世纪初期的机械计算机1.3 图灵测试与计算智能1.4 达特茅斯会议与人工智能的正式诞生 二、早期AI研究与第一次冬天2.1 早期的探索与挑战2.2 早期的专家系统2.3 第一次AI冬天 三、专家…

SpringBoot日常:@Scheduled实现服务启动时执行一次

文章目录 一、Scheduled详解二、逻辑实现1、创建定时任务逻辑方法2、新建一个启动执行类 三、测试结果 说到定时任务&#xff0c;我们应该会想起Scheduled&#xff0c;Quartz以及XXL-JOB&#xff0c;但是有的单体服务或者小项目&#xff0c;为了方便快捷&#xff0c;可能会直接…

【昇思25天学习打卡营第1天】

前言 例如&#xff1a;随着大模型的爆火&#xff0c;这门技术也越来越重要&#xff0c;很多人都开启了关于大模型知识的学习&#xff0c;但大模型需要一定的资源且涉及的模块很多&#xff0c;如果个人想要系统的学习会有些难度&#xff0c;好在有昇思大模型平台&#xff0c;能…

WebRTC群发消息API接口选型指南!怎么用?

WebRTC群发消息API接口安全性如何&#xff1f;API接口怎么优化&#xff1f; WebRTC技术在现代实时通信中占据了重要地位。对于需要实现群发消息功能的应用程序来说&#xff0c;选择合适的WebRTC群发消息API接口是至关重要的。AokSend将详细介绍WebRTC群发消息API接口的选型指南…

光耦测试有关的单词

NC 无连接 Anode 阳极 Cathode 阴极 Vss 负电源电压 device 装置 receive 接收 supply 供应 threshold 门槛 forward 前锋 measure 测量 voltage 电压 current 电流 threshold 门槛 lockout 停/锁定 hysteresis 滞后 propagation 传播 ramp 斜坡 photodiode 光…

本地部署 SenseVoice - 阿里开源语音大模型

本地部署 SenseVoice - 阿里开源语音大模型 1. 创建虚拟环境2. 克隆代码3. 安装依赖模块4. 启动 WebUI5. 访问 WebUI 1. 创建虚拟环境 conda create -n sensevoice python3.11 -y conda activate sensevoice 2. 克隆代码 git clone https://github.com/FunAudioLLM/SenseVoic…

本地部署 Llama3 – 8B/70B 大模型!

Llama3&#xff0c;作为Meta公司新发布的大型语言模型&#xff0c;在人工智能领域引起了广泛的关注。特别是其8B&#xff08;80亿参数&#xff09;版本&#xff0c;在性能上已经超越了GPT-3.5&#xff0c;而且由于是开源的&#xff0c;用户可以在自己的电脑上进行部署。 本文和…

太多项会毁了回归

「AI秘籍」系列课程&#xff1a; 人工智能应用数学基础 人工智能Python基础 人工智能基础核心知识 人工智能BI核心知识 人工智能CV核心知识 多项式回归的过度拟合及其避免方法 通过添加现有特征的幂&#xff0c;多项式回归可以帮助你充分利用数据集。它允许我们甚至使用简…

STL中二分查找函数

1. binary_search binary_search函数用于判断一个元素是否存在于已排序的范围内。其原型如下&#xff1a; bool binary_search( ForwardIt first, ForwardIt last, const T& value ); 其中&#xff0c;first和last是范围的首尾迭代器&#xff0c;value是要查找的元素。如…

【智能算法改进】多策略改进的蜣螂优化算法

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】蜣螂优化算法&#xff08;DBO&#xff09;原理及实现 2.改进点 混沌反向学习初始化 采用 Pwlcm 分段混沌映射&#xff0c;由于 Pwlcm 在其定义区间上具有均匀的密度函数&#xff0c;在特定的…

Java Executors类的9种创建线程池的方法及应用场景分析

在Java中&#xff0c;Executors 类提供了多种静态工厂方法来创建不同类型的线程池。在学习线程池的过程中&#xff0c;一定避不开Executors类&#xff0c;掌握这个类的使用、原理、使用场景&#xff0c;对于实际项目开发时&#xff0c;运用自如&#xff0c;以下是一些常用的方法…

User parameters 用户参数与Web监控

目录 一. 自定义键介绍 二. 制作步骤 1. 添加无可变部分参数 2. 添加有可变参数 3. 使用用户参数监控php-fpm 服务的状态 三. Web页面导入应用监控 四. Web监控 主要功能和操作&#xff1a; 开启方式 官方预定义监控项文档https://www.zabbix.com/documentation/6…

华三m-lag三层转发+VRRP配置案例

目录 一、相关理论介绍 1.1 华三M-LAG介绍 1.2 DRCP协议 1.3 keepalive机制 1.4 MAD机制 1.5 一致性检查功能 二、M-LAG系统建立及工作过程 三、实验组网案例 3.1 组网需求 3.2 组网拓扑 3.3 设备接口及地址规划 四、具体配置命令 4.1 S6850-1的配置 4.2 S6850-2…

华为OD机考题(HJ71 字符串通配符)

前言 经过前期的数据结构和算法学习&#xff0c;开始以OD机考题作为练习题&#xff0c;继续加强下熟练程度。 描述 问题描述&#xff1a;在计算机中&#xff0c;通配符一种特殊语法&#xff0c;广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的…

AI:助力开发者翱翔,而非抢夺其舞台

在当今这个科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;犹如一股春风&#xff0c;悄然渗透进全球各个行业&#xff0c;尤其在软件开发领域&#xff0c;其影响力日益显著。从初创企业到跨国巨头&#xff0c;无一不在积极探索AI如何重塑编程的面貌&#xf…