假设有一个仓库,仓库的容量为10。编写一个 Python 程序来模拟生产者-消费者场景。 程序需要使用多线程的方式实现生产者向仓库中放入产品,消费者从仓库中取出产品,并输出每次操作的结果。
时间: 2024-11-15 13:25:44 浏览: 12
为了模拟生产者-消费者(Producer-Consumer)场景,我们可以使用Python的`threading`模块来创建线程。首先,我们需要定义两个类,一个是生产者(Producer),负责向仓库添加产品,另一个是消费者(Consumer),负责从仓库取出产品。由于Python的标准库中并没有内置的条件变量,我们将使用`queue`模块代替。
```python
import threading
import queue
class Warehouse:
def __init__(self, capacity):
self.capacity = capacity
self.products = queue.Queue()
self.lock = threading.Lock()
def is_full(self):
with self.lock:
return self.products.full()
def is_empty(self):
with self.lock:
return self.products.empty()
def add_product(self, product):
with self.lock:
if not self.is_full():
self.products.put(product)
print(f"Produced {product}. Warehouse size: {self.products.qsize()}")
def remove_product(self):
with self.lock:
if not self.is_empty():
product = self.products.get()
print(f"Picked up {product}. Warehouse size: {self.products.qsize()}")
class Producer(threading.Thread):
def __init__(self, warehouse):
super().__init__()
self.warehouse = warehouse
def run(self):
for _ in range(5): # 生产5次产品
product = f"Product {next(iter(range(10)))}"
self.warehouse.add_product(product)
time.sleep(1) # 模拟生产时间
class Consumer(threading.Thread):
def __init__(self, warehouse):
super().__init__()
self.warehouse = warehouse
def run(self):
while True:
if self.warehouse.is_empty():
print("No more products available. Consumer waiting.")
break
self.warehouse.remove_product()
# 创建仓库和线程实例
warehouse = Warehouse(10)
producer = Producer(warehouse)
consumer = Consumer(warehouse)
# 启动线程
producer.start()
consumer.start()
# 等待所有线程结束
producer.join()
consumer.join()
print("\nSimulation complete.")
```
在这个示例中,我们使用了`Queue`来作为共享数据结构,通过锁定`lock`来保证并发环境下的数据一致性。生产者检查仓库是否满,在不满的情况下添加产品;消费者检查仓库是否空,在不为空的情况下取出产品。程序会模拟生产5次产品并消费,每生产或消费一次就等待1秒。
阅读全文