重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設、域名注冊、服務器等服務
為企業(yè)提供網(wǎng)站建設、域名注冊、服務器等服務
解釋
成都創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、包河網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5高端網(wǎng)站建設、購物商城網(wǎng)站建設、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站建設公司、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為包河等各大城市提供網(wǎng)站開發(fā)制作服務。
什么是生產(chǎn)者和消費者?
兩個模塊(可能是函數(shù)、線程或進程),一個生產(chǎn)數(shù)據(jù),一個消費數(shù)據(jù),生產(chǎn)數(shù)據(jù)的模塊叫生產(chǎn)者,消費數(shù)據(jù)的模塊叫消費者。
為什么要使用生產(chǎn)者-消費者模式?
在多線程開發(fā)時,生產(chǎn)者可能產(chǎn)生數(shù)據(jù)的速度比較快,這時候生產(chǎn)者需要等消費者消費完了才能繼續(xù)生產(chǎn)數(shù)據(jù),因為生產(chǎn)的數(shù)據(jù)沒地方放,如果消費者消費數(shù)據(jù)的速度比較快,消費者就要等待生產(chǎn)者生產(chǎn)數(shù)據(jù),為了解決這種供需不平衡的問題,以達到生產(chǎn)者和消費者之間的一種“平衡”狀態(tài),引入“生產(chǎn)者-消費者“模式
什么是生產(chǎn)者消費者模式?
一個生產(chǎn)者(線程或進程)生產(chǎn)數(shù)據(jù),一個消費者(線程或進程)消費數(shù)據(jù),它們之間通過一個緩沖區(qū)來進行通訊,生產(chǎn)者生產(chǎn)的數(shù)據(jù)放入緩沖區(qū),消費者從緩沖區(qū)取來數(shù)據(jù)進行消費。
生產(chǎn)者消費者模式有什么優(yōu)點?
redis
的list作為隊列,而消費者只需要輪詢隊列中是否有數(shù)據(jù)。同時還能支持集群的伸縮性,當某臺機器宕掉的時候,不會導致整個集群宕掉生產(chǎn)者消費者例子
e.g.
5個廚師做包子,三秒一個,10個食客吃包子,1秒一個,食客吃的又快人又多
import queue
import threading
import time
q = queue.Queue()
def cook(i):
while True:
q.put(f'廚師{i}做de包子')
time.sleep(2)
def hangers_on(j):
while True:
print(f'食客{j}吃了{q.get()}')
time.sleep(1)
for i in range(5):
threading.Thread(target=cook,args=(i,)).start()
for j in range(10):
threading.Thread(target=hangers_on,args=(j,)).start()
用協(xié)程實現(xiàn)同樣的例子
q = asyncio.Queue()
async def hangers_on(j):
while True:
print(f'食客{j}吃了{await q.get()}')
await asyncio.sleep(3)
async def cook(i):
while True:
print(f'廚師{i}做的包子')
await q.put(f'廚師{i}做的包子')
await asyncio.sleep(1)
async def main():
cook_tasks = [asyncio.create_task(cook(j)) for j in range(10)]
hanges_tasks = [asyncio.create_task(hangers_on(i)) for i in range(10)]
await asyncio.gather(*cook_tasks,*hanges_tasks,return_exceptions = True)
asyncio.run(main())