详解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 相关文章推荐
在Django的session中使用User对象的方法
Jul 23 Python
Python面向对象编程基础解析(一)
Oct 26 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 Python
Pycharm连接远程服务器并实现远程调试的实现
Aug 02 Python
Python操作qml对象过程详解
Sep 26 Python
python装饰器代替set get方法实例
Dec 19 Python
python 爬虫 实现增量去重和定时爬取实例
Feb 28 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
Apr 14 Python
Django ModelForm组件原理及用法详解
Oct 12 Python
python 高阶函数简单介绍
Feb 19 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 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
虫族 Zerg 历史背景
2020/03/14 星际争霸
人族 TERRAN 概述
2020/03/14 星际争霸
php xml文件操作代码(一)
2009/03/20 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
2011/10/31 PHP
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
2015/10/08 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
JavaScript  event对象整理及详细介绍
2016/10/10 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
python获取mp3文件信息的方法
2015/06/15 Python
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
解决python-docx打包之后找不到default.docx的问题
2020/02/13 Python
简单了解python关键字global nonlocal区别
2020/09/21 Python
python爬虫线程池案例详解(梨视频短视频爬取)
2021/02/20 Python
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
自我评价范文分享
2014/01/04 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
主题实践活动总结
2014/05/08 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
2014年度培训工作总结
2014/11/27 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android
php解析非标准json、非规范json的方式实例
2022/05/10 PHP