详解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中的二叉树查找算法模块使用指南
Jul 04 Python
Python中optionParser模块的使用方法实例教程
Aug 29 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
May 05 Python
python 计算两个日期相差多少个月实例代码
May 24 Python
Python实现的中国剩余定理算法示例
Aug 05 Python
python flask框架实现重定向功能示例
Jul 02 Python
Python 绘制酷炫的三维图步骤详解
Jul 12 Python
python将类似json的数据存储到MySQL中的实例
Jul 12 Python
为什么从Python 3.6开始字典有序并效率更高
Jul 15 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
Sep 10 Python
Numpy中对向量、矩阵的使用详解
Oct 29 Python
Tensorflow中tf.ConfigProto()的用法详解
Feb 06 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
关于手调机和数调机的选择
2021/03/02 无线电
php在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
使用URL传输SESSION信息
2015/07/14 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
input 输入框内的输入事件详细分析
2010/03/17 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
2013/12/23 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
jquery及js实现动态加载js文件的方法
2016/01/21 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
vue2.0多条件搜索组件使用详解
2020/03/26 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
python迭代器的使用方法实例
2013/11/21 Python
对python 匹配字符串开头和结尾的方法详解
2018/10/27 Python
Python使用random.shuffle()打乱列表顺序的方法
2018/11/08 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
Python网络爬虫之爬取微博热搜
2019/04/18 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
python绘制彩虹图
2019/12/16 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
2020/05/26 Python
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
iostream与iostream.h的区别
2015/01/16 面试题
计算机相关的自我评价
2014/01/15 职场文书
销售经理岗位职责
2014/03/16 职场文书
爱之链教学反思
2014/04/30 职场文书
环境整治工作方案
2014/05/18 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
部队个人年终总结
2015/03/02 职场文书
道德与公民自我评价
2015/03/09 职场文书
开学典礼观后感
2015/06/15 职场文书