Python中的生產者消費者模型,在併發程式設計中使用生產者和消費者模式能夠解決絕大多數併發問題,是本章的重點內容,下面我們一起來看看吧。
生產者消費者模型
在併發程式設計中使用生產者和消費者模式能夠解決絕大多數併發問題。該模式透過平衡生產執行緒和消費執行緒的工作能力來提高程式的整體處理資料的速度。
什麼是生產者消費者模式
生產者消費者模式是透過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而透過阻塞佇列來進行通訊,所以生產者生產完資料(做包子的)之後不用等待消費者(吃包子的)處理,直接扔給阻塞佇列(盤子),消費者不找生產者要資料,而是直接從阻塞佇列裡取,阻塞佇列就相當於一個緩衝區,平衡了生產者和消費者的處理能力。
為什麼要使用生產者和消費者模式
線上程世界裡,生產者就是生產資料的執行緒,消費者就是消費資料的執行緒。在多執行緒開發當中,如果生產者處理速度很快,而消費者處理速度很慢,那麼生產者就必須等待消費者處理完,才能繼續生產資料。同樣的道理,如果消費者的處理能力大於生產者,那麼消費者就必須等待生產者。為了解決這個問題於是引入了生產者和消費者模式。
基於佇列實現生產者消費者模型
from multiprocessing import Process,Queueimport time,random,osdefconsumer(q): while True:
res=q.get()
time.sleep(random.randint(1,3))
print('%s 吃 %s' %(os.getpid(),res))defproducer(q): for i in range(10):
time.sleep(random.randint(1,3))
res='包子%s' %i
q.put(res)
print('%s 生產了 %s' %(os.getpid(),res))if __name__ == '__main__':
q=Queue()
#生產者們:即廚師們 p1=Process(target=producer,args=(q,))
#消費者們:即吃貨們 c1=Process(target=consumer,args=(q,))
#開始 p1.start()
c1.start()
print('主')