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。

最新文章

  1. Python起步(2)
  2. 安装LNMP之后出现 Access denied.解决方法
  3. 《C和指针(Pointer on c)》 学习笔记
  4. 使用SilverLight开发区域地图分析模块
  5. localResizeIMG
  6. debian安装jdk8
  7. hadoop版本号变迁
  8. Codeforces#277 C,E
  9. sonar tomacat配置
  10. 【转】分享一份C语言写的简历
  11. 51 nod 1211 数独 DLX
  12. vue 相关
  13. bzoj 1835 base 基站选址 - 动态规划 - 线段树
  14. 忙里偷闲写的小例子---读取android根目录下的文件或文件夹
  15. Java实现根据输入的日期以及天数,获取此日期之后的天数的工作日
  16. 算法笔记_180:历届试题 国王的烦恼(Java)
  17. clr相关名词
  18. 让VS2013支持 C# 6.0 语法
  19. 服务器上的 Git - 生成 SSH 公钥
  20. Oracle服务器重命名

热门文章

  1. VC+++ 操作word
  2. CSS中的onmouseover和hover有什么区别
  3. Angular进阶教程一
  4. LeetCode 533----Lonely Pixel II
  5. MySQL数据库(13)----忘记root用户密码解决方案【转载】
  6. Apache + WordPress + SSL 完全指南
  7. 微信小程序-05-详解介绍.js 逻辑层文件
  8. Python爬虫教程-05-python爬虫实现百度翻译
  9. OmniGraffle教程(二)
  10. intellij idea下面安装热部署插件 JRebel 5.2