1. 什么是Python条件变量Condition?
在Python多线程编程中,条件变量Condition是一种重要的同步机制。它可以协调不同线程之间的执行顺序,防止线程之间的竞争和死锁。
条件变量Condition包含两个重要的概念:
锁(Lock):保证同一时刻只有一个线程能够访问共享资源。
条件变量(Condition):当共享资源不满足某个条件时,使得线程阻塞,等待条件变为真。
Python的标准库threading
中提供了条件变量Condition的实现。
2. 条件变量Condition的原理
条件变量Condition的原理可以概括为:
每个条件变量都与一个锁相关联,当一个线程需要访问共享资源时,它必须先获得锁。
当线程需要等待条件变量成立时,它将释放锁,并将自己加入到条件变量的等待队列中。
当条件变量成立时,唤醒等待队列中的线程。
被唤醒的线程重新获取锁,并继续执行。
3. 条件变量Condition的基本用法
3.1 等待条件变量
要等待条件变量,可以使用wait()
方法。
下面是一个简单的例子,其中线程1将变量temperature
的值设为0.7,并通知线程2;线程2等待条件变量,当temperature
的值大于0.6时被唤醒:
import threading
temperature = 0 # 共享变量,表示温度
def thread1():
global temperature
temperature = 0.7
with cond:
cond.notify()
def thread2():
with cond:
while temperature <= 0.6:
cond.wait()
print('温度已达到 {:.1f}'.format(temperature))
cond = threading.Condition()
t1 = threading.Thread(target=thread1)
t2 = threading.Thread(target=thread2)
t1.start()
t2.start()
其中,wait()
方法会使线程阻塞,并会释放锁。
在这个例子中,线程2会判断temperature
是否大于0.6,如果不是就会调用wait()
方法,使得线程阻塞并释放锁。当线程1修改了temperature
的值并调用notify()
方法时,线程2才会被唤醒。
3.2 唤醒等待线程
要唤醒等待条件变量的线程,可以使用notify()
或notify_all()
方法。
notify()
方法将唤醒等待队列中的一个线程(任意一个),而notify_all()
方法将唤醒等待队列中的所有线程。这两个方法都不会释放锁,因此必须在锁的保护下进行操作。
下面是一个使用notify_all()
方法唤醒等待线程的例子:
import threading
class Market:
def __init__(self):
self.__customer_count = 0 # 共享变量,表示顾客数
self.__cond = threading.Condition() # 条件变量
def add_customer(self):
with self.__cond:
self.__customer_count += 1
self.__cond.notify_all()
def wait(self):
with self.__cond:
while self.__customer_count <= 0:
self.__cond.wait()
self.__customer_count -= 1
market = Market()
def customer():
market.add_customer()
def waiter():
market.wait()
threads = []
for i in range(5):
threads.append(threading.Thread(target=customer))
threads.append(threading.Thread(target=waiter))
for t in threads:
t.start()
for t in threads:
t.join()
在这个例子中,市场类Market有两个方法,一个是add_customer()
,用于添加顾客;另一个是wait()
,用于等待顾客。当市场没有顾客时,唤醒等待的线程,此时会唤醒所有等待队列中的线程。
4. 总结
Python条件变量Condition是一种重要的同步机制,可以协调不同线程之间的执行顺序,防止线程之间的竞争和死锁。条件变量由锁和等待队列组成,当线程需要等待条件变量时,它将释放锁,并将自己加入到等待队列中;当条件变量成立时,唤醒等待队列中的线程。Python的标准库threading
中提供了条件变量Condition的实现,包括wait()
、notify()
和notify_all()
等方法。