了解‘生产者/消费者’模型

在餐馆吃饭时,厨师做完一道菜后就会把菜从传菜递出去,然后继续做下一道菜。厨师不需要关心顾客是不是已经把菜吃完了。如果厨师做菜的速度大于顾客拿菜的速度,那么就会有越来越多的菜堆在传菜窗口。如果顾客拿菜的速度大于厨师做菜的速度,那么传菜窗口始终都是空的,来一道菜就会立刻被拿走。

在程序开发中,这就是一个典型的“生产者/消费者”模型:厨师是生产者,负责生产;顾客是消费者,负责消费。厨师和顾客各做各的。传菜口就是队列,它把生产者和消费者联系在一起。

实例描述:

使用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秒中的一个随机时间。

        由于生产过程和消费过程时间不对等,所以可能会出现生产者生产的数据堆积在队列中的情况,如下图所示

python班级排队 python排队系统_开发语言