1300

7 分钟

#Python 的可重入锁

互斥锁只能被加锁一次,再次尝试加锁时阻塞,有时一个线程需要多次操作同一共享变量,如果重复加锁,线程会永久阻塞。

例如:

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('结束')

>>> Establishing WebAssembly Runtime.

>>> Standby.

Powered by Shift.

创建于 2025/5/13

更新于 2025/5/21