详解Python中的Lock和Rlock


Posted in Python onJanuary 26, 2021

线程是进程中可以调度执行的实体。而且,它是操作系统中可以执行的最小处理单元。简单地说,一个线程就是一个程序中可以独立于其他代码执行的指令序列。为了简单起见,你可以假设线程只是进程的子集!

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慢

以上就是详解Python中的Lock和Rlock的详细内容,更多关于Python中Lock和Rlock的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
浅析Python中的序列化存储的方法
Apr 28 Python
python使用clear方法清除字典内全部数据实例
Jul 11 Python
轻松实现TensorFlow微信跳一跳的AI
Jan 05 Python
解决Python运行文件出现out of memory框的问题
Dec 03 Python
python3实现多线程聊天室
Dec 12 Python
Python设计模式之原型模式实例详解
Jan 18 Python
如何使用pyinstaller打包32位的exe程序
May 26 Python
python计算二维矩形IOU实例
Jan 18 Python
django中嵌套的try-except实例
May 21 Python
Django解决frame拒绝问题的方法
Dec 18 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 Python
5分钟快速掌握Python定时任务框架的实现
Jan 26 #Python
Python爬虫自动化爬取b站实时弹幕实例方法
Jan 26 #Python
python 实现的车牌识别项目
Jan 25 #Python
Python实现给PDF添加水印的方法
Jan 25 #Python
2021年值得向Python开发者推荐的VS Code扩展插件
Jan 25 #Python
numba提升python运行速度的实例方法
Jan 25 #Python
python中K-means算法基础知识点
Jan 25 #Python
You might like
php5.2 Json不能正确处理中文、GB编码的解决方法
2014/03/28 PHP
php随机抽奖实例分析
2015/03/04 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
JavaScript?Apple设备检测示例代码
2013/11/15 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
2014/02/21 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
2014/05/28 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
js css自定义分页效果
2017/02/24 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
js删除对象中的某一个字段的方法实现
2021/01/11 Javascript
[01:10:16]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第一局
2016/02/27 DOTA
Python中int()函数的用法浅析
2017/10/17 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
Python模块的制作方法实例分析
2019/12/21 Python
基于python3生成标签云代码解析
2020/02/18 Python
Python 去除字符串中指定字符串
2020/03/05 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
python利用os模块编写文件复制功能——copy()函数用法
2020/07/13 Python
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
安踏官方商城:anta.cn
2019/12/16 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
医学院四年学习生活的自我评价
2013/11/06 职场文书
医学生自我评价
2014/01/27 职场文书
遗体告别仪式主持词
2014/03/20 职场文书
竞聘演讲稿开场白
2014/08/25 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书
PyMongo 查询数据的实现
2021/06/28 Python