国际访客建议访问 Primers 编程伙伴 国际服 以获得更好的体验。 快速访问 Python 线程控制 可重入锁

# 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 语句。

前面的代码可改为如下形式:

本文 更新于: 2025-05-31 19:53:12 创建于: 2025-05-31 19:53:12