• 预备
  • 基础语法
  • 容器类型
  • 函数
  • 面向对象
  • 输入输出
  • 进程控制
  • 线程控制
  • 正则表达式
  • 网络编程
  • 图形界面
  • 常见问题
  • API 帮助手册

  • 设置

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