详解Python中的Lock和Rlock
作者:abce 发布时间:2023-08-11 18:35:20
线程是进程中可以调度执行的实体。而且,它是操作系统中可以执行的最小处理单元。简单地说,一个线程就是一个程序中可以独立于其他代码执行的指令序列。为了简单起见,你可以假设线程只是进程的子集!
Locks
锁是Python中用于同步的最简单的方式。锁有两种状态:上锁、释放锁。
锁是线程模块中的一个类,有两个主要方法:acquire()和release() 当调用acquire()方法时,它锁定锁的执行并阻塞锁的执行,直到其他线程调用release()方法将其设置为解锁状态。锁帮助我们有效地访问程序中的共享资源,以防止数据损坏,它遵循互斥,因为一次只能有一个线程访问特定的资源。
让我们看看下面的例子来理解锁的使用:
import threading
#创建一个lock对象
lock = threading.Lock()
#初始化共享资源
abce = 0
def sumOne():
global abce
#锁定共享资源
lock.acquire()
abce = abce + 1
#释放共享资源
lock.release()
def sumTwo():
global abce
#锁定共享资源
lock.acquire()
abce = abce + 2
#释放共享资源
lock.release()
#调用函数
sumOne()
sumTwo()
print(abce)
在上面的程序中,lock是一个锁对象,全局变量abce是一个共享资源,sumOne()和sumTwo()函数扮作两个线程,在sumOne()函数中共享资源abce首先被锁定,然后增加了1,然后abce被释放。sumTwo()函数执行类似操作。 两个函数sumOne()和sumTwo()不能同时访问共享资源abce,一次只能一个访问共享资源。
RLocks
默认的lock不能识别lock当前被哪个线程持有。如果任何线程正在访问共享资源,那么试图访问共享资源的其他线程将被阻塞,即使锁定共享资源的线程也是如此。 在这些情况下,可重入锁(或RLock)用于防止访问共享资源时出现不必要的阻塞。如果共享资源在RLock中,那么可以安全地再次调用它。 RLocked资源可以被不同的线程重复访问,即使它在被不同的线程调用时仍然可以正常工作。
让我们看看下面的例子来理解RLocks的使用:
import threading
#创建一个lock对象
lock = threading.Lock()
#初始化共享资源
abce = 0
#本线程访问共享资源
lock.acquire()
abce = abce + 1
#这个线程访问共享资源会被阻塞
lock.acquire()
abce = abce + 2
lock.release()
print(abce)
在上面的程序中,两个线程同时尝试访问共享资源abce,这里当一个线程当前正在访问共享资源abce时,另一个线程将被阻止访问它。 当两个或多个线程试图访问相同的资源时,有效地阻止了彼此访问该资源,这就是所谓的死锁,因此上述程序没有生成任何输出。
但是,在程序中上述问题可以通过使用RLock来解决。
import threading
#创建一个rlock对象
lock = threading.RLock()
#初始化共享资源
abce = 0
#本线程访问共享资源
lock.acquire()
abce = abce + 1
#这个线程尝试访问共享资源
lock.acquire()
abce = abce + 2
lock.release()
print(abce)
在这里,没有阻止程序中的线程访问共享资源abce。 对于RLock对象锁的每个acquire(),我们需要调用release()一次。
从上面提到的众多程序和解释中,在Python中一个Lock对象和一个RLock对象有很多区别:
locks | rlocks |
---|---|
lock对象无法再被其他线程获取,除非持有线程释放 | rlock对象可以被其他线程多次获取 |
lock对象可被任何线程释放 | rlock对象只能被持有的线程释放 |
lock对象不可以被任何线程拥有 | rlock对象可以被多个线程拥有 |
对一个对象锁定是很快的 | 对一个对象加rlock比加lock慢 |
来源:https://www.cnblogs.com/abclife/p/13196044.html
猜你喜欢
- sqlserver安装完之后(安装参考)我遇到了一个尴尬的问题:之前的安装时是windows选择身份验证的,所以用可视化工具连接到服务器是,
- 导语应好友邀请,帮他写了个小程序,功能类似于实时监控自己关注的UP主,如果关注的UP主中有人发布了抽奖的动态,就自动参与这个抽奖。这样就能不
- 用Go语言实现登录验证,有3次机会,如果用户名为 zhangsan ,密码为 123456 ,则提示登录成功,否则提示还有几次机会,次数用完
- Python assert 语句,又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下
- 人脸磨皮是最基础的人脸美颜效果。主要分为祛斑,祛痘,淡化黑眼圈等步骤。通过前面的学习相信大家一眼都看得出来我们需要干什么才能识别人脸磨皮效果
- Python 能做很多无聊,但有意思的事情,例如接下来的一些案例。以下程序,不要发代码,要不实现不了你整蛊的目的。要打包成一个 exe 程序
- 本文以实例分析了Python中asyncore模块的原理及用法,分享给大家供大家参考。具体分析如下:asyncore库是python的一个标
- 演示技术栈js实战我们也写过很多了,其中每次几乎都用到画布,大家知道它的重要性了吧。今天依旧用到它了。不过我们讲过它的用法就不多说了。 这次
- 1. mysql的md5 mysql存在系统函数md5(“xxxxx”);2. mssql的md5&nb
- 刚刚接触springboot,对很多东西都不熟悉,例如,它的注解方式,他的配置方式等;听说它很牛逼,所以就尝试着去学习。在基本熟悉sprin
- 概述编程的内核是数学,而测试的本质是计算,专业名词叫容量预估,而测试的大体就是用程序模拟程序,检测程序的正确性,有两个点需要注意,QPS最佳
- 使用爬虫时遇到etree红线问题1.首先解释一下该问题的原因是Pycharm的解释器与所要求的解释器不匹配:解决方法很简单:将软件Pycha
- 闪回区爆满问题也是经常会遇到的问题,最关键的是闪回设置大小以及归档被默认存放在了闪回目录,恰巧今天又遇到了这个问题,就记录下处理步骤,仅供遇
- 有些使用Z-Blog的用户询问我,怎么实现我的月光博客首页上这种自动图文混排的版式效果,今天我就详细介绍一下在Z-Blog中实现这种图文混排
- 最近研究了一下并行读入数据的方式,现在将自己的理解整理如下,理解比较浅,仅供参考。并行读入数据主要分1. 创建文件名列表2. 创建文件名队列
- #共有方法 + * instra='人生苦短'strb='我用python'lista=list(range
- 根据TIOBE 编程语言排行榜前20的语言分享相关图书(部分空缺)。在正式介绍编程语言排行之前,你敢不敢先挑战一下自己的编程技能?!测试下自
- 一、简介此模块用于简化paramiko与网络设备之间的ssh连接,可在windows与Unix平台使用 二、目前支持的设备(201
- 打开和关闭文件操作:os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文
- 说说最近的一个案例吧,线上阿里云RDS上的一个游戏日志库最近出现了一点问题,随着游戏人数的增加,在线日