python生产和消费模型_【Python】用Python实现多线程“生产者-消费者”模型的简单例子...

有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。

# -*- 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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值