1. 程式人生 > >生產者消費者模型

生產者消費者模型

世界 one 並發編程 而是 targe sta pre splay color

生產者消費者模型

在並發編程中使用生產者和消費者模式能夠解決絕大多數並發問題。該模式通過平衡生產線程和消費線程的工作能力來提高程序的整體處理數據的速度。

為什麽要使用生產者和消費者模式

在線程世界裏,生產者就是生產數據的線程,消費者就是消費數據的線程。在多線程開發當中,如果生產者處理速度很快,而消費者處理速度很慢,那麽生產者就必須等待消費者處理完,才能繼續生產數據。同樣的道理,如果消費者的處理能力大於生產者,那麽消費者就必須等待生產者。為了解決這個問題於是引入了生產者和消費者模式。

什麽是生產者消費者模式

生產者消費者模式是通過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞隊列來進行通訊,所以生產者生產完數據之後不用等待消費者處理,直接扔給阻塞隊列,消費者不找生產者要數據,而是直接從阻塞隊列裏取,阻塞隊列就相當於一個緩沖區,平衡了生產者和消費者的處理能力。

基於隊列實現生產者消費者模型

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

生產者消費者模型