用python编写程序,使用Condition对象实现线程同步,模拟生产者-消费者问题
时间: 2024-09-24 08:15:53 浏览: 36
用Python的线程来解决生产者消费问题的示例
在Python中,我们可以使用`threading`模块的`Condition`对象来控制线程间的同步,特别是在处理生产者-消费者问题(Producer-Consumer Problem)时。这是一种常见的并发问题,其中一个进程(消费者)负责消耗资源,另一个进程(生产者)负责生成资源,需要保证两者之间数据交换的顺序性和互斥访问。
下面是一个简单的例子,演示了如何使用`Condition`来实现生产者和消费者的同步:
```python
import threading
from queue import Queue
class Producer(threading.Thread):
def __init__(self, condition, queue):
super().__init__()
self.condition = condition
self.queue = queue
self.produce_flag = True
def run(self):
while self.produce_flag:
# 生产任务
item = "Product produced"
with self.condition:
self.queue.put(item)
self.condition.notify() # 唤醒等待的消费者
print(f"Producer produced {item}")
class Consumer(threading.Thread):
def __init__(self, condition, queue):
super().__init__()
self.condition = condition
self.queue = queue
def run(self):
while True:
with self.condition:
if not self.queue.empty(): # 如果队列非空,则消费
item = self.queue.get()
self.condition.notify_all() # 当消费完,通知所有等待的消费者
else:
self.condition.wait() # 队列为空,等待通知
print(f"Consumer consumed {item}")
# 初始化条件变量和队列
condition = threading.Condition()
queue = Queue()
# 创建并启动生产者和消费者
producer = Producer(condition, queue)
consumer = Consumer(condition, queue)
producer.start()
consumer.start()
# 控制生产者的结束
time.sleep(5) # 模拟一段时间后停止生产
producer.produce_flag = False
producer.join()
```
在这个示例中,`condition`用于同步两个线程的操作。当生产者将物品放入队列后,会通过`notify()`唤醒等待的消费者;而消费者在队列非空时开始消费,并在消费完毕后通过`notify_all()`通知所有等待的消费者。
阅读全文