用python使用信号量的方式解决生产者-消费者问题,给出完整代码
时间: 2024-12-22 21:28:22 浏览: 3
理解生产者消费者模型及在Python编程中的运用实例
在Python中,可以使用`threading`模块中的`Semaphore`类来解决生产者-消费者问题,这是一种经典的并发控制场景,用于管理共享资源的访问。下面是一个简单的使用信号量的例子:
```python
import threading
import time
# 定义信号量
semaphore = threading.Semaphore(0) # 初始化为0,表示开始时没有可用资源
# 生产者函数
def producer(queue):
for i in range(5): # 模拟生产商品5次
semaphore.acquire() # 获取信号量,进入临界区
print(f"Producer produced item {i+1}")
queue.append(i + 1) # 添加到队列
semaphore.release() # 释放信号量,允许下一个线程进入
time.sleep(1) # 模拟生产时间
# 消费者函数
def consumer(queue):
while True:
if not queue: # 队列为空,等待
semaphore.acquire()
else:
item = queue.pop(0) # 取出并消费第一个元素
print(f"Consumer consumed item {item}")
semaphore.release()
# 创建生产者和消费者线程
producer_thread = threading.Thread(target=producer, args=(list(),))
consumer_thread = threading.Thread(target=consumer, args=(list(),))
# 启动线程
producer_thread.start()
consumer_thread.start()
# 等待所有线程结束
producer_thread.join()
consumer_thread.join()
print("All threads finished.")
```
在这个例子中,`Semaphore(1)`创建了一个只允许一个线程同时访问临界区的信号量。生产者获取信号量后才能进入,完成任务后释放,让消费者有机会。消费者也是如此,当队列空时会等待,并在有资源时开始消费。
阅读全文