有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。
# -*- coding: gbk -*-
import threading, time
milk = 0
pool_size = 100 #池的大小
mylock = threading.RLock()
class producer(threading.Thread):
"""生产者,主要的业务逻辑为 往池中加入milk,以备消费者使用"""
def __init__(self, step, theadName):
threading.Thread.__init__(self)
self.step = step
self.isRunable = True
self.threadName = theadName
def run(self):
global milk
while True and self.isRunable:
time.sleep(2)
mylock.acquire();
if(milk >= pool_size):
print "[生产者]池中的milk已经足够多[%dL],怎么就没有人来买?" % (milk)
else:
interval = pool_size - milk #防止池溢出,造成浪费
if(interval < self.step):
milk = pool_size
else:
interval = self.step
milk += self.step
print "[生产者]名称:%s 生产了 %dL 的milk 加入了池中, 池中的总量为 %dL" % (self.threadName, interval, milk)
mylock.release()
else:
print "干了一天了,准备休息了拜拜了!"
def stop(self):
self.isRunable = False
class customer(threading.Thread):
def __init__(self, amount , theadName):
threading.Thread.__init__(self)
self.amount = amount
self.isRunable = True
self.threadName = theadName
def run(self):
global milk
while True and self.isRunable:
time.sleep(5)
mylock.acquire();
if(milk > self.amount ) :
milk -= self.amount
print "[消费者]名称 %s 新鲜的milk,我要开始消费了,老板来%dL" % (self.threadName, self.amount)
else:
print "[消费者]池中的milk不足够我消费,等待中....."
mylock.release()
else:
print "差不多了,货都买齐了,准备撤了!"
def stop(self):
self.isRunable = False
if __name__ == "__main__":
p1 = producer(10, "小奶牛")
p2 = producer(20, "老奶牛")
p1.start()
p2.start()
c1 = customer(5, "路人甲")
c2 = customer(4, "路人乙")
c3 = customer(5, "杨白劳")
c1.start()
c2.start()
c3.start()
time.sleep(2*60) #准备结束
p1.stop()
p2.stop()
c1.stop()
c2.stop()