不同线程对线程间共享资源的操作会造成线程不安全,一般采用 threading.RLock
来解决这个问题。
threading.RLock
和 threading.Lock
的区别
threading.Lock
和 threading.RLock
都是 Python
标准库 threading
中提供的锁类型,用于多线程编程中对共享资源的访问控制。它们之间的主要区别在于可重入性( Reentrancy
):
** Lock
(普通锁):**
threading.Lock
是最基本的锁类型,它在任何时候都只允许一个线程获取锁。如果一个线程已经获取了这个锁,其他线程必须等待该线程释放锁之后才能获取它。如果一个线程尝试获取一个已经被其他线程持有的锁,那么它将被阻塞,直到锁被释放。
** RLock
(可重入锁):**
threading.RLock
是可重入锁,也称为递归锁。它允许同一个线程在多个地方获取锁,而不会发生死锁。当一个线程持有 RLock
后,它可以多次获取该锁,每次获取都需要对应一次释放。只有当所有的获取操作都有相应的释放操作时,其他线程才能获取该锁。这种机制允许在同一个线程中进行函数递归或嵌套调用,而不会出现死锁的情况。
使用 threading.RLock
的伪代码:
import threading
import time
# 定义一个全局的 RLock 对象
lock = threading.RLock()
# 一个函数,用于演示对共享资源的访问
def access_resource():
with lock: # 使用 with 语句获取锁
print(f"{threading.current_thread().name} 获取了锁")
time.sleep(1)
print(f"{threading.current_thread().name} 释放了锁")
# 创建多个线程来访问共享资源
threads = []
for i in range(5):
t = threading.Thread(target=access_resource)
threads.append(t)
t.start()
# 等待所有线程结束
for t in threads:
t.join()
print("所有线程执行结束")