• 生产者与消费者模型


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

      

     
  • 相关阅读:
    设计模式学习总结系列应用实例
    【研究课题】高校特殊学生的发现及培养机制研究
    Linux下Oracle11G RAC报错:在安装oracle软件时报file not found一例
    python pro practice
    openstack python sdk list tenants get token get servers
    openstack api
    python
    git for windows
    openstack api users list get token get servers
    linux 流量监控
  • 原文地址:https://www.cnblogs.com/quqinchao/p/9302184.html
Copyright © 2020-2023  润新知