生产者与消费者模型

1、什么是生产者消费者模型?

        生产者:比喻的是程序中负责产生数据的任务

        消费者:比喻的是程序中负责处理数据的任务

        生产者>>共享的介质(队列)<<消费者

2、为何用?

        实现了生产者与消费者的解耦和,生产者可以不停的生产,消费者也可以不停的消费;

        从而平衡了生产者的生产能力与消费者的消费能力,提升了程序的整体运行效率

       什么时候用?

             当我们的程序中存在明显的两类任务,一类负责产生数据,另一类负责处理数据;

             此时就应该考虑使用生产者消费者模型里啊提升程序效率

3、进程间的通信(ICP)之队列


#方式一:pipe  方式二:queue: pipe+锁
from multiprocessing import Queue
q=Queue(3)   #队列对象  先进先出 队列中放三条任意类型信息
#注:队列占用的是内存空间;不应该存放大数据,应该只存放数据量较小的信息
q.put('first')  #放队列信息
q.put('f')
q.put('d')
#放的消息超过队列设置的限制,队列堵塞,必须要取走
print(q.get()) #取队列信息


#生产者们与消费者们
import os
import random
from  multiprocessing import Process,JoinableQueue
import time
def producer(name,food,q):
    for i in range(10):
        res= '%s %s'%(food,i)
        time.sleep(random.randint(1,3))
        q.put(res)  #将信息放到队列中
        print('%s生产了%s'%(name,res))
    #q.put(None)  #最后的信息为none
def consumer(name,q):
    while True :
        res=q.get()    #取队列信息
        if res is None :break   #取出none时就结束
        time.sleep(random.randint(1,3))
        print('%s 吃了%s' %(name,res))
        q.task_done() #告诉队列已经有个数据被取走
if __name__ == '__main__':
    q= JoinableQueue()  #队列对象
    p1=Process(target=producer,args=('egon1','包子1',q,))
    p2 = Process(target=producer, args=('egon2','包子2',q,))
    p3 = Process(target=producer, args=('egon3','包子3',q,))

    c1 = Process(target=consumer, args=('qqc1', q))
    c2 = Process(target=consumer, args=('qqc2', 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() #等待队列被取干净
 #q.join() 结束意味着主进程代码完毕(生产者运行完毕,队列中的数据也被取干净)
    #消费者没有存在的意义要设置为守护进程
    #print('父进程')

  

 

 

posted @ 2018-11-19 10:46  朝朝哥  阅读(416)  评论(0编辑  收藏  举报