用python编写生产者与消费者模型,运用互斥信号量、空位信号量和满位信号量,包含生产失败和消费失败情况
时间: 2024-02-18 09:01:37 浏览: 108
好的,下面是Python代码实现生产者和消费者模型,包含互斥信号量、空位信号量和满位信号量的运用,以及生产失败和消费失败的情况处理:
```python
import threading
import time
import random
mutex = threading.Semaphore(1) # 互斥信号量
full = threading.Semaphore(0) # 满位信号量
empty = threading.Semaphore(10) # 空位信号量,假设队列最多可以存放10个元素
queue = [] # 队列
class Producer(threading.Thread):
def run(self):
global queue
while True:
empty.acquire() # 等待空位信号量,如果队列满了就阻塞
mutex.acquire() # 互斥访问队列
if len(queue) < 10: # 如果队列还没满
item = random.randint(1, 100) # 生产一个随机数
queue.append(item) # 放入队列
print('Produced item:', item)
else: # 如果队列已满
print('Queue is full, production failed')
mutex.release()
full.release() # 发送满位信号量
class Consumer(threading.Thread):
def run(self):
global queue
while True:
full.acquire() # 等待满位信号量,如果队列空了就阻塞
mutex.acquire() # 互斥访问队列
if len(queue) > 0: # 如果队列不为空
item = queue.pop(0) # 取出队首元素
print('Consumed item:', item)
else: # 如果队列已空
print('Queue is empty, consumption failed')
mutex.release()
empty.release() # 发送空位信号量
# 创建10个生产者和10个消费者线程
for i in range(10):
Producer().start()
Consumer().start()
```
在这个示例中,我们创建了一个全局队列`queue`,同时创建了一个互斥信号量`mutex`、一个空位信号量`empty`和一个满位信号量`full`。在生产者线程中,每当队列未满时,就生成一个随机数并放入队列中,如果队列已满则打印“队列已满,生产失败”的消息。在消费者线程中,每当队列不为空时,就从队列中取出队首元素并打印,如果队列已空则打印“队列已空,消费失败”的消息。
值得注意的是,在生产者线程中,我们使用了`empty.acquire()`和`full.release()`来等待空位信号量和发送满位信号量;在消费者线程中,我们使用了`full.acquire()`和`empty.release()`来等待满位信号量和发送空位信号量。这样可以保证生产者和消费者线程之间的同步和互斥。
此外,我们假设队列最多可以存放10个元素,因此在初始化空位信号量时,设为10。如果队列大小不确定,可以将空位信号量和满位信号量设为`threading.Semaphore()`,不指定初始值即可。
阅读全文