您的位置:首页 > 编程语言 > Python开发

python之函数实现生产者消费者模型(开发模型)

2017-02-16 14:47 453 查看
#!/usr/bin/env /python

import threading
import time
import Queue
import random

#生产者
def Proudcer(name,que):
while True:
if que.qsize() < 3: #如果只剩下3个包子就又开始生产包子(如果队列中的数据为3个时)
que.put('baozi') #包子入队列
print '%s 生产包子...' % name
else:
print "%s 仅剩3个包子..."
time.sleep(random.randrange(5)) #随机在1-5秒内开始生产包子(推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起的时间)

#消费者
def Consumer(name,que):
while True:
try:
que.get_nowait() #消费者消费包子(从队列取数据,且为非阻塞模式,如果队列为空了,则会引发出异常)
print ' %s 消费包子...' % name
time.sleep(random.randrange(3))  #随机在1-3秒内开始消费包子(推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起的时间)
except Exception:
print u'包子已卖完...' #捕捉队列为空时引发的异常

#定义一个队列存用来储包子
q = Queue.Queue()

#创建第1个厨师 (也就是线程1,传入name参数:“tantianran”和队列q)
p1 = threading.Thread(target=Proudcer,args=['tantianran',q])
#创建第2个厨师 (也就是线程2
p2 = threading.Thread(target=Proudcer,args=['dengwenqing',q])
#启动线程(线程是同时工作)
p1.start()
p2.start()

#创建2个消费者线程分别为c1和c2
c1 = threading.Thread(target=Consumer,args=['xiaofeizhe1',q])
c2 = threading.Thread(target=Consumer,args=['tanyongxing',q])
#启动线程(线程是同时工作)
c1.start()
c2.start()


下面是一个更具体清晰的例子

#coding:utf-8
import threading, time
import Queue  # 导入消息队列模块
import random  # 导入随机数模块,是为了模拟生产者与消费者速度不一致的情形

q = Queue.Queue()  # 实例化一个对象

def Producer(name):  # 生产者函数
for i in range(20):
q.put(i)  # 将结果放入消息队列中
print '%s:生产包子 数量:%s' % (name, i)
time.sleep(random.randrange(3))  # 生产者的生产速度,3s内

def Consumer(name):  # 消费者函数
count = 0
while count < 20:
data = q.get()  # 取用消息队列中存放的结果
print '消费者:%s 吃包子:%s' % (name, data)
count += 1
time.sleep(random.randrange(4))  # 消费者的消费速度,4s内

p = threading.Thread(target=Producer, args=('tantianran',))
c = threading.Thread(target=Consumer, args=('laowang',))

p.start()
c.start()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python