多线程生产者和消费者
时间: 2023-12-16 12:27:29 浏览: 102
多线程生产者和消费者模型是一种常见的并发编程模型,其目的是平衡生产者和消费者的处理能力,以达到高效的数据处理。下面是一个简单的多线程生产者和消费者的示例代码:
```python
import threading
import time
# 缓冲区大小
BUFFER_SIZE = 10
# 生产者数量
PRODUCER_NUM = 2
# 消费者数量
CONSUMER_NUM = 2
# 缓冲区
buffer = []
# 缓冲区锁
buffer_lock = threading.Lock()
# 缓冲区非空条件变量
not_empty = threading.Condition(buffer_lock)
# 缓冲区非满条件变量
not_full = threading.Condition(buffer_lock)
# 生产者线程类
class ProducerThread(threading.Thread):
def run(self):
global buffer
while True:
# 获取缓冲区锁
buffer_lock.acquire()
# 如果缓冲区已满,等待非满条件变量
while len(buffer) == BUFFER_SIZE:
not_full.wait()
# 生产一个产品
product = time.time()
buffer.append(product)
print("Producer %s produced a product: %s" % (self.name, product))
# 通知其他等待的线程
not_empty.notifyAll()
# 释放缓冲区锁
buffer_lock.release()
# 等待一段时间
time.sleep(1)
# 消费者线程类
class ConsumerThread(threading.Thread):
def run(self):
global buffer
while True:
# 获取缓冲区锁
buffer_lock.acquire()
# 如果缓冲区为空,等待非空条件变量
while len(buffer) == 0:
not_empty.wait()
# 取出一个产品
product = buffer.pop(0)
print("Consumer %s consumed a product: %s" % (self.name, product))
# 通知其他等待的线程
not_full.notifyAll()
# 释放缓冲区锁
buffer_lock.release()
# 等待一段时间
time.sleep(1)
# 创建生产者线程
for i in range(PRODUCER_NUM):
ProducerThread().start()
# 创建消费者线程
for i in range(CONSUMER_NUM):
ConsumerThread().start()
```
上述代码中,我们定义了一个缓冲区和缓冲区锁,以及两个条件变量not_empty和not_full,分别用于表示缓冲区非空和非满的状态。生产者线程通过获取缓冲区锁,判断缓冲区是否已满,如果已满则等待非满条件变量,否则生产一个产品并通知其他等待的线程。消费者线程通过获取缓冲区锁,判断缓冲区是否为空,如果为空则等待非空条件变量,否则取出一个产品并通知其他等待的线程。
阅读全文