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

      生产者消费者模型

    在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。

        为什么要使用生产者和消费者模式

    在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。

        什么是生产者消费者模式

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

    基于队列实现生产者消费者模型

    # from multiprocessing import Process,Queue
    # import time,os
    # def producer(q,name):
    #     for i in range(3):
    #         time.sleep(1)
    #         res='%s%s' %(name,i)
    #         q.put(res)
    #         print('33[45m<%s> 生产了 [%s]33[0m' %(os.getpid(),res))
    #
    #
    # def consumer(q):
    #     while True:
    #         res=q.get()
    #         if res is None:break
    #         time.sleep(1.5)
    #         print('33[34m<%s> 吃了 [%s]33[0m' % (os.getpid(), res))
    #
    # if __name__ == '__main__':
    #     q=Queue()
    #     #生产者们:即厨师们
    #     p1=Process(target=producer,args=(q,'包子'))
    #     p2=Process(target=producer,args=(q,'饺子'))
    #     p3=Process(target=producer,args=(q,'馄饨'))
    #
    #     #消费者们:即吃货们
    #     c1=Process(target=consumer,args=(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('主')
    
    
    
    
    from multiprocessing import Process, JoinableQueue
    import time, os
    
    
    def producer(q, name):
        for i in range(3):
            time.sleep(1)
            res = '%s%s' % (name, i)
            q.put(res)
            print('33[45m<%s> 生产了 [%s]33[0m' % (os.getpid(), res))
        q.join()
    
    def consumer(q):
        while True:
            res = q.get()
            time.sleep(1.5)
            print('33[34m<%s> 吃了 [%s]33[0m' % (os.getpid(), res))
            q.task_done()
    
    if __name__ == '__main__':
        q = JoinableQueue()
    
        # 生产者们:即厨师们
        p1 = Process(target=producer, args=(q, '包子'))
        p2 = Process(target=producer, args=(q, '饺子'))
        p3 = Process(target=producer, args=(q, '馄饨'))
    
        # 消费者们:即吃货们
        c1 = Process(target=consumer, args=(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()
    
        print('')
    View Code
  • 相关阅读:
    Django model中的内嵌类(Class Meta)
    drf框架(二)
    drf框架(一)
    html、CSS 简单回顾
    前端vue框架(五)
    前端vue框架(四)
    前端Vue框架(三)
    前端vue框架(二)
    前端开发Vue框架(二)
    mysql 比较两个日期的时间差
  • 原文地址:https://www.cnblogs.com/wangmengzhu/p/7448382.html
Copyright © 2011-2022 走看看