python 线程锁_对python多线程中Lock()与RLock()锁详解
时间: 2023-12-08 20:06:02 浏览: 45
在 Python 中,多线程编程是很常见的操作。但是多线程编程必然涉及到对共享资源的读写操作,而这很容易引起竞争条件,从而导致数据的不一致性。为了解决这个问题,Python 提供了 Lock 和 RLock 两种锁机制。
1. Lock
Lock 是最简单的锁机制,也是最常用的锁机制。它通过 acquire() 方法获得锁,通过 release() 方法释放锁。当一个线程获得了锁,其他线程就不能再获得这个锁,直到这个线程释放锁为止。
下面是一个简单的例子:
```python
import threading
lock = threading.Lock()
def func():
lock.acquire()
print('Hello, world!')
lock.release()
t = threading.Thread(target=func)
t.start()
```
这个例子中,首先创建了一个 Lock 对象,然后定义了一个 func 函数,在函数中先获得锁,然后输出一句话,最后释放锁。在创建一个线程并执行这个函数时,输出的结果是:
```
Hello, world!
```
在这个例子中,只有一个线程获得了锁,其他线程不能再获得这个锁,所以输出的结果只有一行。
2. RLock
RLock 是可重入锁,它可以被一个线程多次 acquire(),而不会发生死锁。这个锁机制可以用在递归函数中,因为递归函数可能会多次调用自身。
下面是一个简单的例子:
```python
import threading
lock = threading.RLock()
def func():
lock.acquire()
print('Hello, world!')
lock.acquire()
print('Hello, again!')
lock.release()
lock.release()
t = threading.Thread(target=func)
t.start()
```
这个例子中,首先创建了一个 RLock 对象,然后定义了一个 func 函数,在函数中先获得锁,输出一句话,再次获得锁,输出另一句话,最后释放锁。在创建一个线程并执行这个函数时,输出的结果是:
```
Hello, world!
Hello, again!
```
在这个例子中,虽然 func 函数中多次获得了锁,但是由于使用的是可重入锁,所以不会发生死锁,输出的结果也是正确的。
总结:
Lock 和 RLock 都是 Python 中常用的锁机制,Lock 是最简单的锁机制,而 RLock 是可重入锁,可以在递归函数中使用。在多线程编程中,使用这两个锁机制可以有效地避免竞争条件,保证数据的一致性。