zoukankan      html  css  js  c++  java
  • 生产者与消费者模型

    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('父进程')
    

      

     
  • 相关阅读:
    次小生成树模板(poj1679)
    ISAP模板
    ZOJ3781
    Uva12663
    LightOJ1089
    网络流DINIC模板
    FZU2030(括号匹配)
    NOIP2011提高组(选择客栈)
    DRF之视图家族
    DRF多表设计与ModelSerializer组件
  • 原文地址:https://www.cnblogs.com/quqinchao/p/9302184.html
Copyright © 2011-2022 走看看