约 1292 字
约 6 分钟
互斥锁只能被加锁一次,再次尝试加锁时阻塞,有时一个线程需要多次操作同一共享变量,如果重复加锁,线程会永久阻塞。
例如:
from threading import Lock
# 计数器
class Counter:
def __init__(self):
self.__value = 0
self.__lock = Lock()
# 计数加一
def increase(self):
with self.__lock: # 重复加锁
self.__value += 1
# 获取变量并自动加一
def touch(self):
value = 0
with self.__lock: # 加锁
value = self.__value
self.increase()
return value
# 全局变量
counter = Counter()
# 调用
counter.touch()
print('结束')
在大型项目中,你很难确认每一个接口内部是否加过锁,在这种情况下可以使用 可重入锁(ReentrantLock)。
可重入锁允许 同一个线程重复加锁,需要该线程解锁相同的次数,锁才会被真正释放。
在 Python 中使用 threading
模块的 RLock
类创建可重入锁,通过 acquire
方法加锁,release
方法解锁,可以使用 with
语句。
前面的代码可改为如下形式:
from threading import RLock
# 计数器
class Counter:
def __init__(self):
self.__value = 0
self.__lock = RLock()
# 计数加一
def increase(self):
with self.__lock: # 重复加锁
self.__value += 1
# 获取变量并自动加一
def touch(self):
value = 0
with self.__lock: # 加锁
value = self.__value
self.increase()
return value
# 全局变量
counter = Counter()
# 调用
counter.touch()
print('结束')
Loading...
创建于 5/13/2025, 7:51:10 AM
更新于 5/13/2025, 7:51:10 AM