生产者、消费者(条件变量同步)
问题说明
生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。
该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,消费者也在缓冲区消耗这些数据然后重复此过程。
该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据

方法步骤
1.创建一个共享区,共享区的容量为10(使用整型count变量模拟)
2.2个生产者,每个生产者消耗随机的时间单位生产1件商品并放入共享区(count自增1模拟),当共享区已满,生产者停止放入共享区,线程进入block阻塞状态,等待消费者线程唤醒。
3.5个消费者,每个消费者使用随机的时间单位每次从共享区获取1件商品(count自减1模拟),当共享区已空,消费者停止从共享区获取,线程进入block阻塞状态,等待生产者线程唤醒。
代码实例
#生产者、消费者(条件变量同步)
#引入模块
import threading
import time
import random
count = 0 #共享区变量(只有一个共享区,定义在两个类外面,用global调用)
condition = threading.Condition() #创建条件对象
#生产者线程类
class Producer(threading.Thread):
# 重写构造方法
def __init__(self,name):
threading.Thread.__init__(self)
self.__name = name
pass
# 重写run方法
def run(self):
global count #引用全局变量
while True:
# 使用条件对象获取锁并锁定
if condition.acquire():
#判断共享区是否已满
if count >= 10:
print("共享区域已满,生产者线程进入阻塞Block状态,停止放入!")
condition.wait() #此线程进入阻塞状态
else:
count += 1 #共享变量自增1
msg = time.ctime() + '' + self.name + "生产了1件商品放入共享区,共享区总计商品个数:" + str(count)
print(msg)
condition.notify() #唤醒其他阻塞状态的线程(此处为唤醒消费者线程)
condition.release() #解除锁定
time.sleep(random.randrange(10)) #随即休眠一段时间(n秒)
pass
#消费者线程类
class Customer(threading.Thread):
#重写构造方法
def __init__(self,name):
threading.Thread.__init__(self)
self.__name = name
pass
#重写run方法
def run(self):
global count #引用全局变量
while True:
#使用条件对象获取锁并锁定
if condition.acquire():
# 判断共享区是否已空
if count < 1:
print("共享区已空,消费者线程进入阻塞状态,停止获取!")
condition.wait() #此线程进入阻塞状态
else:
count -= 1 #共享变量自减1
msg = time.ctime() + '' + self.name + '消费了1件商品,共享区总计商品个数:' + str(count)
print(msg)
condition.notify() #唤醒其他阻塞状态的线程(此处为唤醒生产者线程)
condition.release() #解除锁定
time.sleep(random.randrange(10)) #随即休眠一段时间(n秒)
#脚本程序入口
if __name__ == "__main__":
for i in range(2):
p = Producer('生产者-' + str(i+1))
p.start()
for i in range(5):
c = Customer('消费者-' + str(i+1))
c.start()
本文仅供参考,是多线程同步问题(条件变量同步)的实例!