[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 ...
随机推荐
- OpenStack IceHouse 部署 - 2 - 网络与软件环境初始化
OpenStack应用:节点软硬件环境配置 节点硬件与IP分配 实验室网关 10.14.39.1 各个节点 节点名称 硬件(Linux硬盘分区,RAM,CPU) ip地址(接口) 作用与运行的服 ...
- sql:Mysql create view,function,procedure
create database Liber; use Liber; #顯示數据庫 20150210 Geovin Du 涂聚文 SHOW DATABASES; drop table BookKindL ...
- 第一天-python基础
每一个今天的坚持都会改变明天的自己! 一.python介绍 python是一门由解释型.弱类型的高级开发编程语言,由龟叔于1989圣诞开发出,后经过二十多年的发展,因其简洁高效的特点而被广泛使用,在世 ...
- 关于构造器和Serlvet的知识点
关于java的构造器方法: 1.java构造方法可以有任何的访问修饰符:public.protected.private或者没有修饰(通常被package或者friendly调用)但是不能有非访问性质 ...
- 微服务架构之spring cloud 介绍
在当前的软件开发行业中,尤其是互联网,微服务是非常炽热的一个词语,市面上已经有一些成型的微服务框架来帮助开发者简化开发工作量,但spring cloud 绝对占有一席之地,不管你是否为java开发,大 ...
- MySQL允许root远程访问
1. mysql -u root -p; // 登录mysql, 并输入密码 2. use mysql; // 打开 mysql 数据库 3. update user ...
- IEC62304开发过程框架
软件开发计划的任务 制定整体软件开发计划 制定设计和开发计划 规划软件开发的工具.标准和方法(Class C) 制定软件集成和集成计划 制定软件验证计划 制定软件风险管理计划 制定配置管理计划 软件需 ...
- hbase启动问题记录
昨天测试环境的Hbase启动有问题,日志中显示: transaction type: 1 error: KeeperErrorCode = NoNode for /hbase hmaster等其他进程 ...
- aspnetcore 认证相关类简要说明二
能过<aspnetcore 认证相关类简要说明一>我们已经了解如何将AuthenticationOptions注入到我们依赖注入系统.接下来,我们将了解一下IAuthenticationS ...
- 乘风破浪:LeetCode真题_007_Reverse Integer
乘风破浪:LeetCode真题_007_Reverse Integer 一.前言 这是一个比较简单的问题了,将整数翻转,主要考察了取整和取余,以及灵活地使用long型变量防止越界的问题. 二.Reve ...