码迷,mamicode.com
首页 > 其他好文 > 详细

生产者消费者模型

时间:2017-08-29 15:33:33      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:阻塞队列   daemon   while   实现   blog   世界   不用   通过   splay   

  生产者消费者模型

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

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

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

    什么是生产者消费者模式

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

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

技术分享
# 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

 

生产者消费者模型

标签:阻塞队列   daemon   while   实现   blog   世界   不用   通过   splay   

原文地址:http://www.cnblogs.com/wangmengzhu/p/7448382.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!