生产者——消费者问题算法代码
时间: 2023-08-30 20:05:14 浏览: 98
生产者-消费者问题是一个经典的同步问题,描述了多个线程之间共享固定大小缓冲区的情境。生产者将数据放入缓冲区,而消费者则从缓冲区中取出数据。下面是一个简单的算法实现:
```python
import threading
import time
# 缓冲区大小
BUFFER_SIZE = 10
# 缓冲区
buffer = []
# 生产者线程
class ProducerThread(threading.Thread):
def run(self):
global buffer
while True:
# 等待一段时间
time.sleep(1)
# 生产一个数据
data = time.time()
# 获取锁
lock.acquire()
# 判断缓冲区是否已满
if len(buffer) < BUFFER_SIZE:
# 将数据放入缓冲区
buffer.append(data)
print("Produced", data)
else:
print("Buffer is full")
# 释放锁
lock.release()
# 消费者线程
class ConsumerThread(threading.Thread):
def run(self):
global buffer
while True:
# 等待一段时间
time.sleep(2)
# 获取锁
lock.acquire()
# 判断缓冲区是否为空
if len(buffer) > 0:
# 从缓冲区中取出数据
data = buffer.pop(0)
print("Consumed", data)
else:
print("Buffer is empty")
# 释放锁
lock.release()
# 创建锁
lock = threading.Lock()
# 创建生产者线程和消费者线程
producer_thread = ProducerThread()
consumer_thread = ConsumerThread()
# 启动线程
producer_thread.start()
consumer_thread.start()
```
上面的代码中,我们使用了 Python 的 threading 模块来创建线程。ProducerThread 类表示生产者线程,ConsumerThread 类表示消费者线程。在 run() 方法中,生产者线程等待一段时间后生成一个数据,如果缓冲区未满,则将数据放入缓冲区中;消费者线程等待一段时间后从缓冲区中取出一个数据,如果缓冲区非空,则将数据取出并打印。
在生产者和消费者线程访问缓冲区时,我们使用了一个 Lock 对象来进行同步。Lock 对象可以确保在同一时间只有一个线程能够访问共享资源。在获取锁之前,线程会一直等待,直到锁被释放。在释放锁之后,其他线程才能获取锁并访问共享资源。
阅读全文