python中的生产者与消费者

  • 在并发编程中,如果生产者处理速度很快,而消费者处理速度比较慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个等待的问题,就引入了生产者与消费者模型。让它们之间可以不停的生产和消费

  • 什么是生产者消费者模式?

  • 生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

这就像,在餐厅,厨师做好菜,不需要直接和客户交流,而是交给前台,而客户去饭菜也不需要不找厨师,直接去前台领取即可。

生产者消费之模型就是,比如一个包子铺,中的顾客吃包子,和厨师做包子,不可能是将包子一块做出来,在给顾客吃,但是单线程只能这么做。

所以用多线程来执行,厨师一边做包子,顾客一边吃包子。

当顾客少时,厨师做的包子就放在一个容器中,等着顾客来吃。

当顾客多的时候,就从容器中先取出来给顾客吃,厨师继续做包子

用队列来模拟这个容器


from queue import Queue
from threading import Thread

import time


q = Queue(maxsize=10)

生产者
def cooker(name):
    count = 1
    while True:
        q.put('包子%d'%count)
        print('%s---生产了---包子%d'%(name,count))
        count +=1
        time.sleep(2)


消费者
def consumer(name):
    while True:
        print('%s吃了%s'%(name,q.get()))
        time.sleep(1)

if __name__ == '__main__':
    #厨师1
    c1 = Thread(target=cooker,args=('刘大厨',))
    c1.start()

    #厨师2
    c2 = Thread(target=cooker,args=('李大厨',))
    c2.start()


    #消费者
    guke1 = Thread(target=consumer,args=('小明',))
    guke1.start()

    guke2 = Thread(target=consumer,args=('铁蛋',))
    guke2.start()

你可能感兴趣的:(Python)