参考教材中生产者消费者算法,创建5个线程,其中两个线程为生产者线程,3个线程为消
时间: 2024-02-06 09:37:06 浏览: 31
费者线程,实现生产者消费者模型。
以下是示例代码:
```python
import threading
import time
import random
# 生产者线程类
class Producer(threading.Thread):
def __init__(self, threadID, itemList, lock):
threading.Thread.__init__(self)
self.threadID = threadID
self.itemList = itemList
self.lock = lock
def run(self):
while True:
item = random.randint(1, 100) # 随机产生一个数作为生产的物品
self.lock.acquire() # 获取锁
if len(self.itemList) < 10: # 如果生产队列中的物品数量小于10
self.itemList.append(item) # 将物品加入生产队列
print(f"Producer {self.threadID}: produced item {item}, total items {len(self.itemList)}")
else:
print(f"Producer {self.threadID}: queue is full, waiting...")
self.lock.release() # 释放锁
time.sleep(random.randint(1, 3)) # 随机休眠一段时间
# 消费者线程类
class Consumer(threading.Thread):
def __init__(self, threadID, itemList, lock):
threading.Thread.__init__(self)
self.threadID = threadID
self.itemList = itemList
self.lock = lock
def run(self):
while True:
self.lock.acquire() # 获取锁
if len(self.itemList) > 0: # 如果生产队列中有物品
item = self.itemList.pop(0) # 取出一个物品
print(f"Consumer {self.threadID}: consumed item {item}, total items {len(self.itemList)}")
else:
print(f"Consumer {self.threadID}: queue is empty, waiting...")
self.lock.release() # 释放锁
time.sleep(random.randint(1, 3)) # 随机休眠一段时间
# 主程序
if __name__ == "__main__":
itemList = [] # 生产队列
lock = threading.Lock() # 锁对象
# 创建生产者线程
for i in range(2):
producer = Producer(i+1, itemList, lock)
producer.start()
# 创建消费者线程
for i in range(3):
consumer = Consumer(i+1, itemList, lock)
consumer.start()
```
以上代码中,我们创建了一个生产队列 `itemList`,用于存放生产者生产的物品,同时创建了一个锁对象 `lock`,用于保证同时只有一个线程可以访问生产队列。
在生产者线程中,我们使用 `acquire()` 方法获取锁,如果生产队列中的物品数量小于 10,就将随机产生的一个数加入到生产队列中,并输出相应的信息;否则,输出队列已满的信息,并等待一段时间。最后,我们使用 `release()` 方法释放锁。
在消费者线程中,我们同样使用 `acquire()` 方法获取锁,如果生产队列中有物品,就取出队列中的第一个物品,并输出相应的信息;否则,输出队列已空的信息,并等待一段时间。最后,我们同样使用 `release()` 方法释放锁。
在主程序中,我们创建了 2 个生产者线程和 3 个消费者线程,并启动它们。通过以上代码,我们成功地实现了生产者消费者模型。