Python中threading模块的Lock和RLock区别详解
作者:生有涯,知无涯
1.解释
1.1 Lock:
Lock锁是Python的原始锁,在锁定时不属于任何一个线程。在调用了 lock.acquire() 方法后,进入锁定状态,lock.release()方法可以解锁。
底层是通过一个函数来实现的,会根据不同的操作系统选择一个最有效的版本实例
1.2 RLock:
RLock被称为重入锁,RLock锁是一个可以被同一个线程多次 acquire 的锁,但是最后必须由获取它的线程来释放它,不论同一个线程调用了多少次的acquire,最后它都必须调用相同次数的 release 才能完全释放锁,这个时候其他的线程才能获取这个锁。
acquire()/release() 对可以嵌套,重入锁必须由获取它的线程释放。一旦线程获得了重入锁,同一个线程再次获取它将不阻塞。
RLock内部的锁的实现和Lock用的是同一个函数。
锁 | 是否同一线程 | 是否可重复加锁 |
Lock | 否 | 否 |
RLock | 是 | 是 |
2.示例
Lock在锁定时不属于特定线程,也就是说,Lock可以在一个线程中上锁,在另一个线程中解锁。
而对于RLock来说,只有当前线程才能释放本线程上的锁,即 解铃还须系铃人 :
import threading import time lock = threading.Lock() lock.acquire() def func(): lock.release() print("lock is released") t = threading.Thread(target=func) t.start()
输出结果为:
lock is released
上面代码中,在主线程中创建锁,并上锁,但是是在t线程中释放锁,结果正常输出,说明一个线程上的锁,可以由另外线程解锁。如果把上面的锁改为RLock则报错。
RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。也就是说,下面的情况对于RLock是允许的:
import threading rlock = threading.RLock() def func(): if rlock.acquire(): # 第一把锁 print("first lock") if rlock.acquire(): # 第一把锁没解开的情况下接着上第二把锁 print("second lock") rlock.release() # 解开第二把锁 rlock.release() # 解开第一把锁 t = threading.Thread(target=func) t.start()
输出结果
first lock
second lock
到此这篇关于Python中threading模块的Lock和RLock区别详解的文章就介绍到这了,更多相关threading模块的Lock和RLock内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!