Condition
的使用场景
- 线程间复杂同步:当线程间需要根据某些条件进行复杂的同步操作时使用,比如一个线程需要等待另一个线程完成特定任务后才能继续执行,而不仅仅是简单的锁机制能满足的场景。
- 生产者 - 消费者模型:生产者和消费者线程之间需要协调数据的生产和消费节奏,确保缓冲区不会溢出或空读。
生产者 - 消费者模型关键代码片段及解释
import threading
import time
class Producer(threading.Thread):
def __init__(self, condition, buffer):
threading.Thread.__init__(self)
self.condition = condition
self.buffer = buffer
def run(self):
for i in range(10):
with self.condition:
# 检查缓冲区是否已满
while len(self.buffer) >= 5:
print("缓冲区已满,生产者等待")
self.condition.wait()
self.buffer.append(i)
print(f"生产者生产: {i}")
# 通知消费者可以消费了
self.condition.notify()
time.sleep(1)
class Consumer(threading.Thread):
def __init__(self, condition, buffer):
threading.Thread.__init__(self)
self.condition = condition
self.buffer = buffer
def run(self):
while True:
with self.condition:
# 检查缓冲区是否为空
while not self.buffer:
print("缓冲区为空,消费者等待")
self.condition.wait()
item = self.buffer.pop(0)
print(f"消费者消费: {item}")
# 通知生产者可以生产了
self.condition.notify()
time.sleep(1)
if __name__ == "__main__":
buffer = []
condition = threading.Condition()
producer = Producer(condition, buffer)
consumer = Consumer(condition, buffer)
producer.start()
consumer.start()
producer.join()
consumer.join()
- 初始化部分:
- 定义了
Producer
和Consumer
两个类,继承自threading.Thread
。
- 每个类的构造函数接收
condition
和buffer
,condition
用于线程间同步,buffer
作为共享的数据缓冲区。
- 生产者
Producer
类:
run
方法是线程执行体。
- 使用
with self.condition
语句获取锁,进入临界区。
while len(self.buffer) >= 5:
循环检查缓冲区是否已满,如果满了,调用self.condition.wait()
释放锁并等待,直到被其他线程唤醒。
- 当缓冲区不满时,生产数据并添加到缓冲区,打印生产信息。
- 调用
self.condition.notify()
通知等待在condition
上的其他线程(通常是消费者线程)。
- 消费者
Consumer
类:
run
方法为线程执行体。
- 同样使用
with self.condition
获取锁进入临界区。
while not self.buffer:
循环检查缓冲区是否为空,如果空了,调用self.condition.wait()
释放锁并等待,直到被唤醒。
- 当缓冲区有数据时,从缓冲区取出数据,打印消费信息。
- 调用
self.condition.notify()
通知等待在condition
上的其他线程(通常是生产者线程)。
- 主程序部分:
- 创建共享缓冲区
buffer
和Condition
对象condition
。
- 实例化生产者和消费者线程,并启动它们。
- 调用
join
方法等待两个线程执行完毕。