Python互斥锁实例(包含超时解锁)

Python互斥锁实例(包含超时解锁)

文章目录

  • 前言
  • 正文
    • 1 锁被占用直接返回
    • 2 拿不到锁则一直等待
    • 3 拿不到锁等待直到超时
  • 总结

前言

最近遇到一个小需求,大概是请求机器人&自动化设备执行某些功能,这些功能之间有共同操作资源或在业务逻辑上有冲突,如何保证多线程的请求不会同时执行造成损失。1

这里使用的是互斥锁,当有任务正在执行时写了如下几种处理方式:

  1. 直接返回
  2. 等待拿到锁,继续执行
  3. 等待拿到锁,继续执行或超时返回

正文

代码如下:

import threading
import timeprocess_lock = threading.Lock()def process1(id_num):name = 'process1-' + str(id_num)if process_lock.locked():print(name, ' is locked')returnif process_lock.acquire():time.sleep(0.1)print(name, ' get lock ')process_lock.release()print(name, ' release lock')def process2(id_num):name = 'process2-' + str(id_num)if process_lock.locked():print(name, ' is locked')if process_lock.acquire():time.sleep(0.2)print(name, ' get lock ')process_lock.release()print(name, ' release lock')def process3(id_num):name = 'process3-'+str(id_num)if process_lock.locked():print(name, ' is locked')if process_lock.acquire(blocking=True, timeout=0.3):try:print(name, ' get lock')time.sleep(0.2)finally:process_lock.release()print(name, ' release lock')if __name__ == '__main__':# # 如果锁被占用则直接返回# for i in range(3):#     threading.Thread(target=process1, args=(i,)).start()# # 如果拿不到锁则一直等待# for i in range(3):#     time.sleep(0.1)#     threading.Thread(target=process2, args=(i,)).start()# 如果拿不到锁则等待,直到超时for i in range(3):threading.Thread(target=process3, args=(i,)).start()

1 锁被占用直接返回

process1-1  is locked
process1-2  is locked
process1-0  get lock 
process1-0  release lock

0号线程拿到了锁,1 2线程没拿到锁直接返回

2 拿不到锁则一直等待

process2-1  is locked
process2-0  get lock 
process2-0  release lock
process2-2  is locked
process2-1  get lock 
process2-1  release lock
process2-2  get lock 
process2-2  release lock

0 1 2三个线程逐次拿到锁,执行后释放

3 拿不到锁等待直到超时

process3-0  get lock
process3-1  is locked
process3-2  is locked
process3-0  release lock
process3-1  get lock
process3-1  release lock

0 拿到锁执行完释放,2拿到锁再释放,于此同时3已经超时

总结

虽然这篇文章写的比较基础,但是实际使用中大家可能都会用的到,整理记录于此。


  1. threading — Thread-based parallelism — Python 3.12.2 documentation ↩︎

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

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

相关文章

Linux:导出环境变量命令export

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的内建命令export命令用于创建一个环境变量,或将一个普通变量导出为环境变量,并且在这个过程中,可以给该环境变量赋值。 下面…

多数问题求解之蒙特卡洛与分治法

多数问题(Majority Problem)是一个有多种求解方法的经典问题,其问题定义如下: 给定一个大小为 n n n的数组,找出其中出现次数超过 n / 2 n/2 n/2的元素 例如:当输入数组为 [ 5 , 3 , 5 , 2 , 3 , 5 , 5 ] […

【WPS】压缩图片

第一步: 点击插入,点击图片 第二步: 点击图片工具,点击压缩图片 第三步:

Vue3 前端生成随机id( 生成 UUID )

效果展示 封装工具(代码展示) 重新创建一个文件**/utils/someTools.js**,并在里面写入如下代码。 function Tools() {}Tools.prototype.guid function () {return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replace(/[xy]/g, function (c) {v…

jQuery模态框弹窗提示代码

jQuery模态框弹窗提示代码 下载地址 jQuery模态框弹窗提示代码

GPT每日面试题—Vue中style的scoped是如何实现样式隔离的

充分利用ChatGPT的优势,帮助我们快速准备前端面试。今日问题:Vue中style的scoped是如何实现样式隔离的。 Q:在前端面试中,如果被问到,vue文件中的scoped是如何实现样式格式的,什么回答比较好,全…

Requests教程-17-请求代理设置

上一小节我们学习了requests解决乱码的方法,本小节我们讲解一下requests设置代理的方法。 代理基本原理 代理实际上指的就是代理服务器, 英文叫作proxy server ,它的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中…

【阿里云系列】-基于云效构建部署Springboot项目到ACK

介绍 为了提高项目迭代的速度加速交付产品给客户,我们通常会选择CICD工具来减少人力投入产生的成本,开源的工具比如有成熟的Jenkins,但是本文讲的是阿里云提高的解决方案云效平台,通过配置流水线的形式实现项目的快速部署到服务器…

【数据结构】双向链表及LRU缓存的实现

目录 前言 1. 在原有的自定义链表类 Linked 的基础上,添加新的 “节点添加”方法 addNode(Node node) 测试用例 测试结果 2. 在自定义链表类的基础上,使用双重循环“强力” 判断两个节点是否发生相交 测试用例 测试结果 3. 在自定义链表类的基础上…

突破编程_C++_面试(STL 编程 list)

面试题 1 :描述 std::list 的内部数据结构是什么,以及它如何影响性能? std::list 的内部数据结构是一个双向链表。这意味着它是由一系列节点组成的,每个节点都包含两部分:一部分是存储实际数据的数据域,另…

每日OJ题_哈希表⑤_力扣49. 字母异位词分组

目录 力扣49. 字母异位词分组 解析代码 力扣49. 字母异位词分组 49. 字母异位词分组 难度 中等 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入…

基于opencv的手势识别

当然可以,下面是一个使用OpenCV实现简单手势识别,并在摄像头捕捉的视频中描绘出手部轮廓为线条的示例。该代码会读取摄像头流,然后检测出手部,并用线条描绘出手的轮廓。 首先,你需要安装OpenCV库。如果你还没有安装&am…

Vulnhub靶机:Kioptrix_Level1.1

一、介绍 运行环境:Virtualbox 攻击机:kali(192.168.56.101) 靶机:Kioptrix_Level1.1(192.168.56.104) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vul…

C语言例2-3:从键盘输入一个正整数(位数小于或等于10),判断其是否是回文数

回文数是将自然数n的各位数字反向排列得到自然数n1,若n1与n相等,则称为回文数,例如12321 //从键盘输入一个正整数(位数小于或等于10),判断其是否是回文数 //回文数是将自然数n的各位数字反向排列得到自然数…

Mac管理Ruby环境

在 macOS 上切换 Ruby 环境主要涉及到使用不同的 Ruby 版本管理工具,比如 RVM(Ruby Version Manager)或 rbenv。下面分别介绍如何使用这两种工具在 Mac 上切换 Ruby 环境: 使用 RVM 切换 Ruby 环境 安装 RVM: 首先&am…

spring boot对外部文件的访问

很多朋友都会遇到这个问题,项目打包成jar格式,本地其他盘符里面的文件访问不到(项目达成war包的和资源是在服务器访问的请忽视),这里只需要在配置文件中添加配置,然后使用建立一个WebMvcConfigurerAdapter拦截就可以了 (1) 首先 …

(BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等

看面试题可以是为了面试,也可以是对自己学到的东西的一种查漏补缺,更加深刻的去了解一些核心知识点 Spring面试高频问题 问题一:谈 需要zi料 绿色徽【vip1024b】 谈你对spring IOC 和 DI 的理解,它们有什么区别? **问题…

Xterminal:未来的终端体验

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 开发环境篇 ✨特色专栏: M…

CTR之行为序列建模用户兴趣:DIEN

前言 在上一篇文章中 CTR之行为序列建模用户兴趣:DIN,开启了用户行为序列建模用户兴趣的篇章。DIN引入了Attention机制,对于不同的候选item,可以根据用户的历史行为序列,动态地学习用户的兴趣表征向量。但是&#xff…

java通用Excel解析工具类

为了创建一个通用的Excel解析工具类&#xff0c;我们需要考虑以下几点&#xff1a; 泛型支持&#xff0c;以便能够处理不同类型的Java对象。映射机制&#xff0c;以将Excel列映射到Java对象的字段。错误处理和日志记录。 以下是一个简化的通用Excel解析工具类的示例 <dep…