生产者(Productor)将产品交给店员(Clerk),消费者(Customer)从店员处取走产品; 店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产; 如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。
时间: 2024-02-05 19:12:07 浏览: 169
一个生产者与消费者的例子.
这是一个经典的生产者消费者问题,可以使用多线程实现。
首先,我们需要定义一个产品类,包含产品的编号和名称:
```python
class Product:
def __init__(self, id, name):
self.id = id
self.name = name
```
然后,我们定义一个店员类,负责管理产品的生产和消费。店员类有三个属性:产品列表、产品容量、生产者和消费者的锁。在生产者和消费者之间,店员充当中间人的角色,协调两者之间的交互。
```python
import threading
class Clerk:
def __init__(self, capacity):
self.products = []
self.capacity = capacity
self.product_lock = threading.Lock()
self.customer_lock = threading.Lock()
def produce(self):
while True:
self.product_lock.acquire()
if len(self.products) < self.capacity:
product = Product(len(self.products) + 1, f"Product {len(self.products) + 1}")
self.products.append(product)
print(f"Producer produced {product.name}")
self.product_lock.release()
else:
print("Producer is waiting")
self.product_lock.release()
self.customer_lock.acquire()
def consume(self):
while True:
self.customer_lock.acquire()
if len(self.products) > 0:
product = self.products.pop(0)
print(f"Customer consumed {product.name}")
self.customer_lock.release()
else:
print("Customer is waiting")
self.customer_lock.release()
self.product_lock.acquire()
```
在上面的代码中,`produce`方法是生产者线程使用的方法,它不断地尝试生产产品,如果产品列表长度小于容量,就生产一个新的产品并把它加入到产品列表中,然后释放产品锁;否则就释放产品锁,并且获取消费者锁,等待消费者消费。
`consume`方法是消费者线程使用的方法,它不断地尝试消费产品,如果产品列表长度大于零,就取出第一个产品并将其从产品列表中删除,然后释放消费者锁;否则就释放消费者锁,并且获取产品锁,等待生产者生产。
最后,我们定义一个主函数,创建一个店员对象,然后创建一个生产者线程和一个消费者线程,并启动它们。
```python
if __name__ == "__main__":
clerk = Clerk(20)
producer_thread = threading.Thread(target=clerk.produce)
consumer_thread = threading.Thread(target=clerk.consume)
producer_thread.start()
consumer_thread.start()
```
这样,我们就完成了一个简单的生产者消费者模型的实现。
阅读全文