Python多线程同步锁

Python同步锁

多线程是共用一个进程空间的,当多个线程要用到相同的数据,那么久会存在资源竞争和锁的问题。

锁是用来实现共享资源的同步访问。为每一个共享资源创建一个Lock对象,当需要访问共享资源的时候,调用acquire方法来获取锁对象,如果其他线程已经得到了该锁,那就需要等待其他线程释放。等资源访问后,就需要调用release方法来释放锁。

不加锁

import threading
import timenum=100
def fun_sub():global numnum2=numtime.sleep(0.01)num=num2-1if __name__=='__main__':thread_list=[]for thread in range(100):t=threading.Thread(target=fun_sub)t.start()thread_list.append(t)for t in thread_list:t.join()print('num',num)

 

定义了一个全局变量,此时存在资源竞争的现象。

加锁

import threading
import timenum=100
def fun_sub():global numlock.acquire()  #加锁到释放后的代码只能一个线程可以运行print('加锁')num2=numtime.sleep(0.01)num=num2-1print('释放锁')lock.release()if __name__=='__main__':thread_list=[]lock=threading.Lock() #创建一把同步锁for thread in range(100):t=threading.Thread(target=fun_sub) #创建100个线程t.start()thread_list.append(t)for t in thread_list:t.join()print('num',num)

死锁

python中多个线程在共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁,这个时候两个线程将会一直等待下去。

import threading
import timelock = threading.Lock()  class MyThread(threading.Thread):def __init__(self):threading.Thread.__init__(self)def run(self):self.fun1()self.fun2()def fun1(self):lock.acquire()  # 如果锁被占用,则阻塞在这里,等待锁的释放print ("线程 %s , 想拿: %s--%s" %(self.name, "苹果",time.ctime()))lock.acquire()print ("线程 %s , 想拿: %s--%s" %(self.name, "香蕉",time.ctime()))lock.release()lock.release()def fun2(self):lock.acquire()print ("线程 %s , 想拿: %s--%s" %(self.name, "香蕉",time.ctime()))# time.sleep(0.01)lock.acquire()print ("线程 %s , 想拿: %s--%s" %(self.name, "苹果",time.ctime()))lock.release()lock.release()if __name__ == "__main__":for i in range(0, 10):  #建立10个线程my_thread = MyThread()  #类继承法是python多线程的另外一种实现方式my_thread.start()

递归锁

import threading
import timelock = threading.RLock()  #递归锁class MyThread(threading.Thread):def __init__(self):threading.Thread.__init__(self)def run(self):self.fun1()self.fun2()def fun1(self):lock.acquire()  # 如果锁被占用,则阻塞在这里,等待锁的释放print ("线程 %s , 想拿: %s--%s" %(self.name, "苹果",time.ctime()))lock.acquire()print ("线程 %s , 想拿: %s--%s" %(self.name, "香蕉",time.ctime()))lock.release()lock.release()def fun2(self):lock.acquire()print ("线程 %s , 想拿: %s--%s" %(self.name, "香蕉",time.ctime()))# time.sleep(0.01)lock.acquire()print ("线程 %s , 想拿: %s--%s" %(self.name, "苹果",time.ctime()))lock.release()lock.release()if __name__ == "__main__":for i in range(0, 10):  #建立10个线程my_thread = MyThread()  #类继承法是python多线程的另外一种实现方式my_thread.start()

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

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

相关文章

目标检测再升级!YOLOv8模型训练和部署

YOLOv8 是 Ultralytics 开发的 YOLO(You Only Look Once)物体检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的SOTA模型,它建立在先前YOLO成功基础上,并引入了新功能和改进,以进一步提升性能和灵活性。它可…

springboot集成cas客户端

Background 单点登录SSO(Single Sign ON),指在多个应用系统中,只需登录一次,即可在多个应用系统之间共享登录。统一身份认证CAS(Central Authentication Service)是SSO的开源实现,利用CAS实现SSO可以很大程…

【Python学习】Python学习8-Number

目录 【Python学习】Python学习8-Number 前言在变量赋值时被创建Python支持四种不同的数据类型整型(Int)长整型(long integers)浮点型(loating point real values)复数(complex numbers) Python Number 类型转换Python math 模块、cmath 模块Python数学函数Python随…

以太网交换基础

0x00 前言 以为主要的作用的笔记的记忆,所以多为问答的形式进行记录。 什么是以太网? 以太网是一种局域网技术,用于链接终端,进行网络通信。 什么是冲突域? 冲突域是指连接在同一公共介质上的所有节点的集合。 就…

【Leetcode】 447. 回旋镖的数量

文章目录 题目思路代码 题目 447. 回旋镖的数量 思路 问题要求计算平面上所有回旋镖的数量,即找到满足题设条件的点组合 (i, j, k)。回旋镖的定义是指有两个相同的距离,分别从点 i 到 j 和点 i 到 k。具体思路是: 遍历每个点&#xff0c…

【数据结构 | 二叉树入门】

数据结构 | 二叉树入门 二叉树概念:二叉树特点:二叉树的基本形态特殊二叉树满二叉树完全二叉树 二叉树的存储结构二叉树的遍历先序遍历中序遍历后序遍历 计算二叉树的节点个数计算叶子节点的个数树的高度求第k层节点个数 二叉树概念: 如下图…

怎么将营业执照图片转为excel表格?(批量合并识别技巧)

一、为何要将营业执照转为excel表格? 1、方便管理:将营业执照转为excel格式,可以方便地进行管理和整理,快速查找需要的信息。 2、数据处理:Excel可以提供丰富的计算和数据分析功能,转化为excel后方便数据…

12.字符串和正则表达式

使用正则表达式 正则表达式相关知识 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要,正则表达式就是用于描述这些规则的工具,换句话说正则表达式是一种工具,它定义了字符串的匹配模式(…

Ubuntu上安装VMware+win11系统手册

Ubuntu安装vmware 下载: Linux 版下载地址:https://www.vmware.com/go/getworkstation-linux 安装: sudo chmod x VMware-Workstation-Full-17.5.0-22583795.x86_64.bundle 执行安装命令: sudo ./VMware-Workstation-Full-17.5.0…

AArch64 memory management学习(二)

提示 该博客主要为个人学习,通过阅读官网手册整理而来(个人觉得阅读官网的英文文档非常有助于理解各个IP特性)。若有不对之处请参考参考文档,以官网文档为准。AArch64 memory management学习一共分为两章,这是第二章。…

python基础教程八(循环1)

1. while循环 为避免多次重复的代码&#xff0c;我们会用到循环 while (condition): 执行语句 while循环的结构非常简单只要条件满足就一直循环直到&#xff0c;条件不满足为止。 例子如下&#xff1a; x1 while x<100:print(x)x1结果就是最简单的输出1-100的数字 while…

西电期末考点总结

一.“打擂台” 介绍 打擂台用于找到一个数组中的最值问题&#xff0c;先设置一个虚拟擂主&#xff0c;并保证他是“最弱的”&#xff0c;然后遍历数组&#xff0c;找到“更强的”数据&#xff0c;就交换擂主&#xff0c;“打”到最后的“擂主”就是最值数据 相关题目 1004.…

Vant2组件库van-list+Toast下拉加载滚动条回顶问题

目录 List 列表 Toast 轻提示 解决方案 1、不使用 Toast 的 加载提示 2、修改调整 pointer-event 属性值 3、判断是否为第一次加载再使用 背景 &#xff1a; 移动端项目 开发时&#xff0c;有数据长列表展示的场景需求&#xff0c;此时就用到了 Vant2 组件库里面的 <v…

Tsmaster使用笔记整理

选择厂商 根据你所选择的CAN分析仪的厂商&#xff0c;确定你的厂商设备设置。 我一般会选择PEAK&#xff0c;和 ZLG多一点&#xff0c;其他的没有用过。除了上图中的&#xff0c;市面上的CAN分析仪还有CANanlyst、广成科技、创芯科技等&#xff0c;但它们都不能在Tsmaster上使…

电源芯片浪涌电流如何产生?该怎么测试?

对于电源芯片的设计和制造商来说&#xff0c;防止芯片受到电源干扰是非常重要的。为了保障芯片能正常稳定运行&#xff0c;浪涌测试无疑是必要的。本篇文章将全方位为你介绍浪涌电流如何产生以及如何测试的过程。 电源芯片浪涌电流的产生原因 1.开关电源切换和电压突变 在电源开…

ATTCK视角下的信息收集:组策略信息收集

目录 什么是组策略&#xff1f; 本地组策略收集 域组策略收集 组策略存储收集 组策略对象收集 什么是组策略&#xff1f; Windows中的组策略&#xff08;Group Policy&#xff09;是一种管理和配置Windows操作系统的功能&#xff0c;它允许系统管理员对计算机和用户的行为…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -用户信息修改实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

Qt 6之五:创建菜单

Qt 6之五&#xff1a;创建菜单 Qt是一种跨平台的C应用程序开发框架&#xff0c;它提供了一套丰富的工具和库&#xff0c;可以帮助开发者快速构建跨平台的应用程序&#xff0c;用于开发图形用户界面&#xff08;GUI&#xff09;和非GUI应用程序。 Qt 6之一&#xff1a;简介、安…

untiy使用http下载资源

文章目录 提醒下载一个资源并保存到本地下载一张图片 提醒 部分API需要将Unity的 Edit/PrejectSetting/Player/OtherSetttings/AConfiguration/ApiCompatibilityLevel 设为.NetFramework 才可以使用 下载一个资源并保存到本地 private IEnumerator DownloadFormServer_IE(st…

cisp难不难?cisp如何备考通过率高?

*CISP 全称为Certified Information Security Professional&#xff0c;是国际上广受欢迎的信息安全专业认证之一。 对于许多信息安全领域的从业者来说&#xff0c;CISP认证是他们职业生涯中的重要一步。那么&#xff0c;CISP难不难呢?如何备考通过率更高呢?接下来&#xf…