[Python 多线程] RLock可重入锁 (九)
RLock
可重复锁,是线程相关的锁。同样是线程相关的还有threading.local。
线程A获得可重用锁,并可以多次成功获取,不会阻塞。最后要再线程A中和acquire次数相同的release。
例1:
import threading lock = threading.Lock() lock.acquire() ret = lock.acquire()
print(1,ret) 运行结果:
阻塞中
在主线程中,使用阻塞锁加锁后,再次获取锁就阻塞了,比如第一个锁释放掉才可以获取。
例2:
import threading lock = threading.Lock() lock.acquire() ret = lock.acquire(False)
print(1,ret) 运行结果:
1 False
使用非阻塞锁获取,返回False,表示没有获取到锁。
例3:
import threading lock = threading.RLock() ret = lock.acquire()
print(ret)
ret = lock.acquire()
print(ret) 运行结果:
True
True
使用RLock可重入锁,第一个锁没有释放,第二个也能获取到锁。
例4:
import threading lock = threading.RLock() ret = lock.acquire()
print(ret)
ret = lock.acquire(timeout=3)
print(ret)
ret = lock.acquire(True)
print(ret)
ret = lock.acquire(False)
print(ret) lock.release()
lock.release()
lock.release()
lock.release() 运行结果:
True
True
True
True
与acquire相应次数的release释放。
例5:
import threading lock = threading.RLock() ret = lock.acquire()
print(ret)
ret = lock.acquire(timeout=3)
print(ret)
ret = lock.acquire(True)
print(ret)
ret = lock.acquire(False)
print(ret) lock.release()
lock.release()
lock.release()
lock.release()
lock.release() #多release一次 运行结果:
True
True
True
True
Traceback (most recent call last):
File "C:/python/test.py", line 18, in <module>
lock.release()
RuntimeError: cannot release un-acquired lock
但只要多一个release就会抛RuntimeError异常,提示无法释放一个un-acquire的锁。
例6:
import threading lock = threading.RLock() def subThread(lock:threading.RLock):
lock.release() ret = lock.acquire()
print(ret)
ret = lock.acquire(timeout=3)
print(ret)
ret = lock.acquire(True)
print(ret)
ret = lock.acquire(False)
print(ret) t = threading.Thread(target=subThread,args=(lock,))
t.start() 运行结果:
True
True
True
True
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:/python/test.py", line 6, in subThread
lock.release()
RuntimeError: cannot release un-acquired lock
acquire是在主线程获取了四个,新起了一次子线程,在子线程中release,抛出RuntimeError异常,说明RLock是线程级别的,在哪个线程acquire的,就需要在这个线程release,其它无法release。也就是说RLock无法跨线程。需要跨线程就得使用Lock。
[Python 多线程] RLock可重入锁 (九)的更多相关文章
- Redis分布式锁—Redisson+RLock可重入锁实现篇
前言 平时的工作中,由于生产环境中的项目是需要部署在多台服务器中的,所以经常会面临解决分布式场景下数据一致性的问题,那么就需要引入分布式锁来解决这一问题. 针对分布式锁的实现,目前比较常用的就如下几种 ...
- Java多线程系列——深入重入锁ReentrantLock
简述 ReentrantLock 是一个可重入的互斥(/独占)锁,又称为“独占锁”. ReentrantLock通过自定义队列同步器(AQS-AbstractQueuedSychronized,是实现 ...
- C++多线程之可重入锁
#include<iostream> #include<thread> #include<mutex> using namespace std; recursive ...
- 【多线程】可重入锁 ReentrantLock
java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能.而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也 ...
- python threading编程中的LOCK和RLOCK(可重入锁)
找到一本PYTHON并发编辑的书, 弄弄.. #!/usr/bin/env python # -*- coding: utf-8 -*- import threading import time sh ...
- 举例讲解Python中的死锁、可重入锁和互斥锁
举例讲解Python中的死锁.可重入锁和互斥锁 一.死锁 简单来说,死锁是一个资源被多次调用,而多次调用方都未能释放该资源就会造成死锁,这里结合例子说明下两种常见的死锁情况. 1.迭代死锁 该情况是一 ...
- Python连载36-线程数量限制、Timer、可重入锁
一.允许一个资源最多由几个线程同时进行 命令行:threading.Semaphore(个数) 代表现在最多有几个线程可以进行操作 import threading import time #参数定义 ...
- “全栈2019”Java多线程第二十九章:可重入锁与不可重入锁详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 多线程通信的两种方式? (可重入锁ReentrantLock和Object)
(一)Java中线程协作的最常见的两种方式: (1)利用Object的wait().notify()和notifyAll()方法及synchronized (2)使用Condition.Reentra ...
随机推荐
- android inflate压力泵,将视图发生整合的过程
转自:https://blog.csdn.net/u012702547/article/details/52628453?utm_source=copy inflate方法从大范围来看,分两种,三个参 ...
- Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类
Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何 ...
- 【转载】Spring Cloud底层原理
概述 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓 ...
- jQuery UI简单的讲解
我们先进入一下问答时间,你都知道多少呢? (1)什么是jQuery UI 呢? 解答:jQuery UI 是以 jQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互. ...
- Bzoj4766: 文艺计算姬(Matrix-tree/prufer)
BZOJ 答案就是 \(n^{m-1}m^{n-1}\) \(prufer\) 证明: \(n\) 中的数字出现 \(m-1\) 次,\(m\) 中出现 \(n-1\) 次,根据 \(prufer\) ...
- bootstrap学习笔记(网页开发小知识)
这是我在学习Boostrap网页开发时遇到的主要知识点: 1.导航条navbar 添加.navbar-fixed-top类可以让导航条固定在顶部,固定的导航条会遮住页面上的其他内容,除非给<bo ...
- Java 实时论坛 - Sym 1.4.0 发布
简介 Sym 是一个用 Java 写的实时论坛,欢迎来体验! 如果你需要搭建一个企业内网论坛,请使用 SymX. 作者 Sym 的主要作者是 Daniel 与 Vanessa,所有贡献者可以在这里看到 ...
- Qt Quick程序的发布
要将程序发布出去,首先需要使用release方式编译程序,然后将生成的.exe可执行文件和需要的库文件发在一起打包进行发布. 要确定需要哪些动态库文件,可以直接双击.exe文件,提示缺少那个dll文件 ...
- Wireframe Process
- MySQL案例05:CPU负载优化
最近有套系统数据库周末总是告警,CPU使用率超过90%,开始由开发那边再跟进处理,我也就没参与,后来发现没进展就登录上去看了下,然后进行了部分优化,优化后效果还是比较明显的,具体优化过程本文会做详细的 ...