生产者消费者模型

Posted Dreamkily

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生产者消费者模型相关的知识,希望对你有一定的参考价值。

  生产者消费者模型

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

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

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

    什么是生产者消费者模式

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

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

技术分享
# 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(‘\033[45m<%s> 生产了 [%s]\033[0m‘ %(os.getpid(),res))
#
#
# def consumer(q):
#     while True:
#         res=q.get()
#         if res is None:break
#         time.sleep(1.5)
#         print(‘\033[34m<%s> 吃了 [%s]\033[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(\033[45m<%s> 生产了 [%s]\033[0m % (os.getpid(), res))
    q.join()

def consumer(q):
    while True:
        res = q.get()
        time.sleep(1.5)
        print(\033[34m<%s> 吃了 [%s]\033[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

 

以上是关于生产者消费者模型的主要内容,如果未能解决你的问题,请参考以下文章

golang生产者消费者模型示例代码

LINUX多线程(生产者消费者模型,POXIS信号量)

转: Java并发编程之十三:生产者—消费者模型(含代码)

Java生产消费者模型——代码解析

生产者消费者模型

生产者消费者模型-Java代码实现