python生产者消费者模型

1、什么是生产者消费者模型
生产者消费者模型指的是一种解决问题的思路
 
该模型中包含两类明确的角色:
1、生产者:创造数据的任务
2、消费者:处理数据的任务
 
2、为什么要用生产者消费者模型?
1、实现生产者与消费者任务的解耦和
2、平衡了生产者的生产力与消费者消费力
 
一旦程序中出现明显的两类需要并发执行的任务,一类是负责数据的,另外一类是负责处理数据的
那么就可以使用生产者消费者模型来提升执行效率
 
 
3、如何用
 
生产者----》队列《-------消费者
 
实例一:
from multiprocessing import Queue,Process
import time

#1、队列占用的是内存控制,即便是不指定队列的大小也不可能无限制地放数据
#2、队列是用来传递消息的介质,即队列内存放的是数据量较小的数据


def producer(name,food,q):
    for i in range(5):
        res='%s%s' %(food,i)
        time.sleep(1)
        print('\033[45m厨师%s 生产了%s\033[0m' %(name,res))
        q.put(res)


def consumer(name,q):
    while True:
        res=q.get()
        if res is None:break
        time.sleep(2)
        print('\033[47m吃货%s 吃了%s\033[0m' %(name,res))

if __name__ == '__main__':
    q = Queue()
    #生产者们
    p1=Process(target=producer,args=('egon','泔水',q))
    p2=Process(target=producer,args=('刘清政','臭豆腐',q))
    p3=Process(target=producer,args=('崔昆强','翔',q))

    #消费者们
    c1 = Process(target=consumer, args=('alex', q))
    c2 = Process(target=consumer, args=('李杰', q))


    p1.start()
    p2.start()
    p3.start()
    c1.start()
    c2.start()

    p1.join()
    p2.join()
    p3.join()
    q.put(None)
    q.put(None)
    print('主')

    # 应该在生产者们生产完毕后,往队列的末尾放结束信号None

  

案例二:

from multiprocessing import JoinableQueue,Process
import time

def producer(name,food,q):
    for i in range(5):
        res='%s%s' %(food,i)
        time.sleep(1)
        print('\033[45m厨师%s 生产了%s\033[0m' %(name,res))
        q.put(res)


def consumer(name,q):
    while True:
        res=q.get()
        time.sleep(2)
        print('\033[47m吃货%s 吃了%s\033[0m' %(name,res))
        q.task_done()

if __name__ == '__main__':
    q = JoinableQueue()
    #生产者们
    p1=Process(target=producer,args=('egon','泔水',q))
    p2=Process(target=producer,args=('刘清政','臭豆腐',q))
    p3=Process(target=producer,args=('崔昆强','翔',q))

    #消费者们
    c1 = Process(target=consumer, args=('alex', q))
    c2 = Process(target=consumer, args=('李杰', q))
    c1.daemon=True
    c2.daemon=True

    p1.start()
    p2.start()
    p3.start()
    c1.start()
    c2.start()

    p1.join()
    p2.join()
    p3.join()
    q.join() # 1、证明生产者都已经完全生产完毕 2、队列为空,也就是消费者也消费完毕
    # print('主')

  

posted @ 2018-06-25 16:59  cyh追梦寻  阅读(164)  评论(0)    收藏  举报