了解‘生产者/消费者’模型
在餐馆吃饭时,厨师做完一道菜后就会把菜从传菜递出去,然后继续做下一道菜。厨师不需要关心顾客是不是已经把菜吃完了。如果厨师做菜的速度大于顾客拿菜的速度,那么就会有越来越多的菜堆在传菜窗口。如果顾客拿菜的速度大于厨师做菜的速度,那么传菜窗口始终都是空的,来一道菜就会立刻被拿走。
在程序开发中,这就是一个典型的“生产者/消费者”模型:厨师是生产者,负责生产;顾客是消费者,负责消费。厨师和顾客各做各的。传菜口就是队列,它把生产者和消费者联系在一起。
实例描述:
使用python自带的queue对象来实现队列:
(1)使用python实现一个简单的“生产者/消费者”模型。
(2)使用python的queue对象做信息队列。
在python使用多线程实现生产者与消费者的程序中,可以使用python自带的queue对象来作为生产者与消费者沟通的队列。
在下面代码中,生产者负责产生两个数字,消费者负责把两个数字相加。
import time
import random
from queue import Queue
from threading import Thread
class Producer(Thread): #生产者
def __init__(self,queue):
super().__init__() #显式的调用父类的初始方法
self.queue=queue
def run(self):
while True:
a=random.randint(0,10)
b=random.randint(90,100)
print(f'生产者产生了两个数字:{a},{b}')
self.queue.put((a,b)) #把两个数字用元祖的形式放进队列中
time.sleep(2)
class Consumer(Thread): #消费者
def __init__(self,queue):
super().__init__()
self.queue=queue
def run(self):
while True:
num_tuple=self.queue.get(block=True) #block=True表示,如果队列为空则阻塞再这里,直到队列有数据为止
sum_a_b=sum(num_tuple)
print(f'消费者消费了一组数,{num_tuple[0]}+{num_tuple[1]}={sum_a_b}')
time.sleep(random.randint(0,10))
queue=Queue()
producer=Producer(queue)
consumer=Consumer(queue)
producer.start()
consumer.start()
while True:
time.sleep(1)
生产者固定每两秒生产一组数,然后把这一组数放进队列里。
消费者每次从队列里面取一组数,将它们相加然后打印出来。消费者取一次数的时间是1~10秒中的一个随机时间。
由于生产过程和消费过程时间不对等,所以可能会出现生产者生产的数据堆积在队列中的情况,如下图所示