python lock_python多线程Lock和RLock的区别

python多线程Lock和RLock的区别

1. 两种锁的不同

1.1 定义

为了确保对共享资源的访问,python提供了两种锁,一个是上一篇提到的Lock,还有一个就是RLock,他们的区别在于:

Lock是可用的最低级别的同步指令,一个线程只能请求一次,而RLock是可以被一个线程请求多次的同步指令

当Lock处于锁定状态时,不被特定的线程所拥有,而RLock使用了“拥有的线程”和“递归等级”的概念,因此处于锁定状态时,可以被线程拥有

1.2 死锁

Lock在下面的情形下会发生死锁

Lock.acquire()

Lock.acquire()

Lock.release()

Lock.release()

连续两次acquire请求,会导致死锁,因为第一次获得锁之后还没有释放时,第二次acquire请求紧接着就到来,可是acquire会让程序阻塞,无法执行release(),这就导致锁永远无法释放,死锁是非常危险非常严重的问题

1.3 可重入锁

RLock就不存在1.2中所提到的死锁问题

RLock.acquire()

RLock.acquire()

RLock.release()

RLock.release()

不过要保证有多少次acquire(),就有多少次release()

2. 怎么会多次请求锁呢?

最初接触到Lock和RLock这两者之间的不同之处时,感到十分困惑。RLock的优势在于,在同一个线程里可以多次申请锁,而Lock则不能,必须在释放之后才能再次申请,那么,这样做也没问题啊,不会出现第一次申请后,在释放前又申请的可能啊,在编写代码的时候,完全可以认为的控制这种情况的发生。

然而事实并非如此,我现在假设一种情形,使得死锁的发生不可避免

import threading

m_lock = threading.Lock()

def h():

with m_lock:

print('h')

def g():

with m_lock:

print('g')

h()

g()

上面的例子中,h()和g()中都用了Lock,在多线程环境下,他们可以做到相安无事,但是,程序的结构总是处于变化中,尤其是那些庞大的系统,一个小小的变化可能牵一发而动全身,假设发生了下面的变化

import threading

m_lock = threading.Lock()

# m_lock = threading.RLock()

def h():

with m_lock:

g()

print('h')

def g():

with m_lock:

print('g')

h()

g()

在h()函数中,获得锁以后要执行g(),那么此时,程序就会发生死锁,在大的项目里,情况会比这更加复杂,你很难通过眼前的几行代码发现这种死锁的情况,因为很可能发生死锁的地方是在很深层次的调用过程中,因此,使用RLock是非常安全的选择.

执行上面的代码,程序不会输出任何信息,也永远不会结束,因为已经发生了死锁,将注释的Lock替换成RLock,程序立马可以执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开式蓄冷罐与闭式蓄冷罐_一罐将其全部统治:Arquillian + Java 8

开式蓄冷罐与闭式蓄冷罐借助Java 8 ,已实现了许多新的语言改进,以简化开发人员的生活。 在我看来, Java 8的最大优点之一是,在某些情况下,已开发的代码看起来比使用以前的方法更漂亮,我指的是Lambdas和Meth…

C 预处理指令

C 预处理指令C语言、C 语言的预处理器。用于在编译器处理程序之前预扫描源代码,完成头文件的包含, 宏扩展, 条件编译, 行控制(line control)等操作编译的四个阶段C语言标准规定,预处理是指前4个编译阶段(phases of tra…

将html代码转换为dom,将HTML字符转换为DOM节点并动态添加到文档中

将HTML字符转换为DOM节点并动态添加到文档中将字符串动态转换为DOM节点,在开发中经常遇到,尤其在模板引擎中更是不可或缺的技术。字符串转换为DOM节点本身并不难,本篇文章主要涉及两个主题:1 字符串转换为HTML DOM节点的基本方法及…

python 的csr_python的高级数组之稀疏矩阵

稀疏矩阵的定义:具有少量非零项的矩阵(在矩阵中,若数值0的元素数目远多于非0元素的数目,并且非0元素分布没有规律时,)则称该矩阵为稀疏矩阵;相反,为稠密矩阵。非零元素的总数比上矩阵所有元素的总数为矩阵的…

通过Spring集成进行消息处理

Spring Integration提供了Spring框架的扩展,以支持著名的企业集成模式。 它在基于Spring的应用程序中启用轻量级消息传递,并支持与外部系统的集成。 Spring Integration的最重要目标之一是为构建可维护且可测试的企业集成解决方案提供一个简单的模型。 …

鸿蒙系统多会发布,华为官宣鸿蒙系统将发布,还将发布多款新品

华为今日官宣,6月2日20:00,将举行鸿蒙操作系统及华为全场景新品发布会。【1、鸿蒙OS2.0】本次发布会的重点将是推出华为今年的重点战略产品——鸿蒙系统。届时鸿蒙OS2.0正式版将陆续推送给手机用户。5月中旬时华为就先行推送了一波鸿蒙OS开发…

C语言结构体字节对齐

默认字节对齐C语言结构体字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这个问题,彻底弄懂到底是怎么回事,给你一个结构体定义和平台机器位数就能手动计算出结构体占用字节数,现在我们不使用宏#pragma…

shell shocked伴奏版_Shell Shocked

【游戏简介】Shell Shocked是一款全新卡牌对战题材的策略类手机游戏。游戏有着丰富的卡牌种类,极具策略性的玩法。游戏中玩家可以将进行真人游戏对战,随机抽取卡牌对战。玩家必须采取适合的策略,才有可能赢取游戏。 游戏操作简单,…

meetup_使用RxNetty访问Meetup的流API

meetup本文将涉及多个主题:响应式编程,HTTP,解析JSON以及与社交API集成。 完全在一个用例中:我们将通过非夸张的RxNetty库实时加载和处理新的metup.com事件,结合Netty框架的强大功能和RxJava库的灵活性。 Meetup提供了…

html约束验证的例子,HTML5利用约束验证API来检查表单的输入数据的代码实例

HTML5对于表单有着极大程度的优化,无论是语义,小部件,还是数据格式的验证。我猜你肯定会以浏览器兼容作为借口不愿意使用这些“新功能”,但这绝不应该成为使你停滞不前的原因,况且还有像Modernizr和ployfill这样的工具…

C语言经典题(1)

输入某年某月某日,判断这一天是这一年的第几天?程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天#include int mai…

jpg图片使用pil的resize后_如何使用PIL调整图像大小并保持其纵横比?

是否有一种显而易见的方法可以解决这个问题? 我只是想制作缩略图。#1楼PIL已经可以选择裁剪图像img ImageOps.fit(img, size, Image.ANTIALIAS)#2楼我丑陋的例子。函数获取文件如:“pic [0-9a-z]。[extension]”,将它们调整为120x120&#x…

openshift_OpenShift上的Java EE工作流(技术提示#64)

openshift该网络研讨会展示了如何使用WildFly , JBoss Tools , Forge , Arquillian和OpenShift在OpenShift上创建Java EE工作流。 具体来说,它谈论: 如何使用JBoss Developer Studio轻松开发Java EE应用程序并将其直接…

C语言面试-指针和引用的使用场景?

先解决两个疑问◆ 指针和引用的不同之处是什么?◆ 何时用用指针?何时用引用?指针和引用的不同之处看如下代码:指针是用来表示内存地址的,而指针这个整数正是被指向的变量地址。而引用就是给变量重新起了一个名字&#…

排序算法html,排序算法总结.html

排序算法总结 | borens blog排序算法总结borens blog首页所有文章关于作者排序算法总结Apr 6, 2018| 技术人生| 阅读排序,顾名思义,将数据按照某种规则排列起来.这种规则可以是根据基本的数值大小排序,也可以是通过字符串长度比较来排序,又或者是优先根据两个字符串的第一个不…

win10商店下载位置_win10应用商店下载的东西在哪

win10应用商店下载的东西在哪?我们都知道,微软从win8开始,就推出了应用商店,到现在的win10,还是一样。现在的win10应用商店里的东西也越来越丰富了。但是有些win10新用户朋友们在win10应用商店下载了东西,准…

异步http 超时_具有CompletableFuture的异步超时

异步http 超时有一天&#xff0c;我重写了执行不佳的多线程代码&#xff0c;该代码在Future.get()某个时刻被阻塞&#xff1a; public void serve() throws InterruptedException, ExecutionException, TimeoutException {final Future<Response> responseFuture async…

C语言指针变量与一维数组

数组元素之间的地址是相连的&#xff1b;变量地址绝对不是相连的&#xff0c;如果找到规律那也只是一个偶然的&#xff0c;不是必然的&#xff1b;1. 指针变量和一位数组下面对指针数组进行分析&#xff0c;index(小标是从0开始)&#xff0c;array数组是int类型&#xff0c;每一…

天干地支计算公式_高大上:天干地支计算方法

天干地支是我国古代计算年月日的重要依据&#xff0c;作为现代人的我们&#xff0c;有必要去了解一下&#xff0c;他们&#xff0c;以备不时之需。首先介绍一下&#xff0c;天干和地支。共有十天干和十二地支。十天干&#xff1a;甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(…

input发送a.jax_JAX-RS 2.0:服务器端处理管道

input发送a.jax这篇文章的灵感来自JAX-RS 2.0规范文档 &#xff08;附录C&#xff09;中的Processing Pipeline部分。 我喜欢它的原因在于它提供了JAX-RS中所有模块的漂亮快照-以准备好吞咽的胶囊形式&#xff01; 礼貌– JAX-RS 2.0规范文档 因此&#xff0c;我想到了使用此…