详解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 基础学习第二弹 类属性和实例属性
Aug 27 Python
Python Trie树实现字典排序
Mar 28 Python
用python制作游戏外挂
Jan 04 Python
Python GUI编程 文本弹窗的实例
Jun 11 Python
python脚本调用iftop 统计业务应用流量的思路详解
Oct 11 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
Jan 08 Python
python实现堆排序的实例讲解
Feb 21 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
Apr 22 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
python定义类的简单用法
Jul 24 Python
详解anaconda安装步骤
Nov 23 Python
Python软件包安装的三种常见方法
Jul 07 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
编写安全 PHP应用程序的七个习惯深入分析
2013/06/08 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
PHP 常用的header头部定义汇总
2015/06/19 PHP
window.showModalDialog使用手册
2007/01/11 Javascript
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
2008/12/29 Javascript
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
JavaScript将字符串转换为整数的方法
2015/04/14 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
前端html中jQuery实现对文本的搜索功能并把搜索相关内容显示出来
2017/11/14 jQuery
javascript单张多张图无缝滚动实例代码
2020/05/10 Javascript
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
Python实现简单的语音识别系统
2017/12/13 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
python使用参数对嵌套字典进行取值的方法
2019/04/26 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
python能做哪方面的工作
2020/06/15 Python
python 实现汉诺塔游戏
2020/11/28 Python
Django缓存Cache使用详解
2020/11/30 Python
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
HTML5新特性之type=file文件上传功能
2018/02/02 HTML / CSS
西班牙自行车和跑步商店:Alltricks
2018/07/07 全球购物
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
意大利单身交友网站:Meetic
2020/07/12 全球购物
学校安全防火方案
2014/06/07 职场文书
欢度春节标语
2014/07/01 职场文书
个人借条范本
2015/05/25 职场文书
毕业生的自我鉴定表范文
2019/05/16 职场文书
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技