python如何用锁和信号量来避免两个线程的竞争
时间: 2024-05-03 14:17:26 浏览: 12
在Python中,可以使用`threading`模块中的锁和信号量来避免两个线程的竞争。
锁的作用是防止多个线程同时执行临界区代码,从而避免竞争条件。在Python中,可以使用`threading.Lock()`来创建一个锁对象,然后使用`acquire()`方法获取锁,使用`release()`方法释放锁。当一个线程获取锁时,其他线程如果想要获取锁就会被阻塞,直到锁被释放。
信号量的作用是控制并发线程的数量。在Python中,可以使用`threading.Semaphore()`来创建一个信号量对象,然后使用`acquire()`方法获取信号量,使用`release()`方法释放信号量。当一个线程获取信号量时,如果信号量已经被其他线程获取,那么它就会被阻塞,直到有足够的信号量可用。
下面是一个使用锁和信号量的示例代码:
```python
import threading
# 创建一个锁对象
lock = threading.Lock()
# 创建一个信号量对象,限制同时执行的线程数量为2个
semaphore = threading.Semaphore(2)
def worker():
# 获取锁
lock.acquire()
print("线程{}正在执行...".format(threading.current_thread().name))
# 释放锁
lock.release()
def worker_with_semaphore():
# 获取信号量
semaphore.acquire()
print("线程{}正在执行...".format(threading.current_thread().name))
# 释放信号量
semaphore.release()
# 创建10个线程,每个线程都执行worker函数
for i in range(10):
t = threading.Thread(target=worker)
t.start()
# 创建10个线程,每个线程都执行worker_with_semaphore函数
for i in range(10):
t = threading.Thread(target=worker_with_semaphore)
t.start()
```
在上面的代码中,我们创建了一个锁对象和一个信号量对象,并分别在`worker()`函数和`worker_with_semaphore()`函数中使用它们来保证线程的同步和并发数量的控制。