Python多进程用两个信号量处理生产者消费者问题
时间: 2024-03-06 08:20:25 浏览: 95
生产者消费者问题是一个经典的并发编程问题。在Python中,可以使用多进程来解决这个问题。下面是一个使用两个信号量处理生产者消费者问题的Python多进程实现:
```python
import multiprocessing
import random
import time
# 生产者进程
def producer(queue, empty, full):
while True:
# 随机生成一个数字
num = random.randint(1, 100)
# 等待empty信号量
empty.acquire()
# 向队列中添加数据
queue.put(num)
print("生产者生产了数据:", num)
# 释放full信号量
full.release()
# 休眠一段时间
time.sleep(random.randint(1, 3))
# 消费者进程
def consumer(queue, empty, full):
while True:
# 等待full信号量
full.acquire()
# 从队列中获取数据
num = queue.get()
print("消费者消费了数据:", num)
# 释放empty信号量
empty.release()
# 休眠一段时间
time.sleep(random.randint(1, 3))
if __name__ == '__main__':
# 创建一个队列,用于存储数据
queue = multiprocessing.Queue()
# 创建两个信号量,分别表示队列空和队列满
empty = multiprocessing.Semaphore(10)
full = multiprocessing.Semaphore(0)
# 创建两个进程,一个生产者,一个消费者
p1 = multiprocessing.Process(target=producer, args=(queue, empty, full))
p2 = multiprocessing.Process(target=consumer, args=(queue, empty, full))
# 启动进程
p1.start()
p2.start()
# 等待进程结束
p1.join()
p2.join()
```
在上面的代码中,我们使用了两个信号量,一个表示队列空,一个表示队列满。生产者在向队列中添加数据时,需要先等待empty信号量,表示队列不为空;添加完数据后,释放full信号量,表示队列已经有数据了。消费者在从队列中获取数据时,需要先等待full信号量,表示队列不为空;获取完数据后,释放empty信号量,表示队列已经有空位了。这样,就可以保证生产者和消费者之间的同步。
阅读全文