详解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中RawString的理解介绍
Jul 07 Python
Python 详解基本语法_函数_返回值
Jan 22 Python
python与C互相调用的方法详解
Jul 14 Python
python实现一个简单的并查集的示例代码
Mar 19 Python
浅析Python pandas模块输出每行中间省略号问题
Jul 03 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
Python一个简单的通信程序(客户端 服务器)
Mar 06 Python
使用python实现哈希表、字典、集合操作
Dec 22 Python
python 计算概率密度、累计分布、逆函数的例子
Feb 25 Python
使用Python内置模块与函数进行不同进制的数的转换
Apr 26 Python
写好Python代码的几条重要技巧
May 21 Python
Python3的进程和线程你了解吗
Mar 16 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将数据库导出成excel的方法
2010/05/07 PHP
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
2014/06/09 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
javascript中检测变量的类型的代码
2010/12/28 Javascript
8个超棒的学习 jQuery 的网站 推荐收藏
2011/04/02 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
正则表达式替换html元素属性的方法
2016/11/26 Javascript
React-router4路由监听的实现
2018/08/07 Javascript
Vue动态加载异步组件的方法
2018/11/21 Javascript
解决vue admin element noCache设置无效的问题
2019/11/12 Javascript
使用JavaScript获取Django模板指定键值数据
2020/05/27 Javascript
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
Opencv+Python识别PCB板图片的步骤
2021/01/07 Python
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
C#笔试题
2015/07/14 面试题
大学生职业生涯规划范文
2014/01/08 职场文书
合作意向协议书范本
2014/03/31 职场文书
小学语文教师竞聘演讲稿范文
2019/08/09 职场文书
Python中for后接else的语法使用
2021/05/18 Python
MySQL 存储过程的优缺点分析
2021/05/20 MySQL
vue使用watch监听属性变化
2022/04/30 Vue.js