Python併發程式設計之多程序 生產者消費者模型

2021-10-17 09:00:57 字數 4363 閱讀 4674

在併發程式設計中, 生產者消費者模式通過乙個容器來解決生產者和消費者之間的強耦合性, 兩者之間不再是直接通訊, 而是通過堵塞佇列來進行通訊, 生產者(生產速度快)不必再等待消費者是否處理完資料, 消費者直接從佇列中取, 該佇列就相當於乙個緩衝區, 平衡了生產者和消費者的工作能力, 從而提高了程式整體的資料處理速度

通過佇列 : 生產者------>佇列------->消費者

from multiprocessing import process, queue

import time, random

defproducer

(q, name, food)

:for i in

range(3

):res = f""

time.sleep(random.randint(1,

3))# 模擬生產者資料產出時間

q.put(res)

# 將產生的資料放入到佇列中

print

(f"\033[1;35m:生產了:\033[0m"

)def

consumer

(q, name)

:while

true

: res = q.get(

)# 取出資料

if res ==

none

:break

# 判斷是否none, none代表佇列取完了,結束

time.sleep(random.randint(1,

3))# 模擬消費者處理資料時間

print

(f"\033[1;36m吃了\033[0m"

)if __name__ ==

"__main__"

: q = queue(

)# 建立佇列

# 開啟三個生產者程序

p1 = process(target=producer, args=

(q,"shawn"

,"香腸"))

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(

)# 主程序再想佇列裡面放入兩個none,當消費者拿到後代表取完了

q.put(

none

) q.put(

none

)print

("痞老闆:主"

)'''輸出

shawn:生產了:香腸0

派大星:生產了:熱狗0

章魚哥吃了香腸0

蟹老闆吃了熱狗0

派大星:生產了:熱狗1

shawn:生產了:香腸1

海綿寶寶:生產了:雞0

章魚哥吃了熱狗1

海綿寶寶:生產了:雞1

派大星:生產了:熱狗2

章魚哥吃了雞0

蟹老闆吃了香腸1

shawn:生產了:香腸2

海綿寶寶:生產了:雞2

痞老闆:主

蟹老闆吃了熱狗2

章魚哥吃了雞1

蟹老闆吃了香腸2

章魚哥吃了雞2

process finished with exit code 0

'''

q = joinablequeue([maxsize]): 與 queue 的物件一樣, 但佇列允許專案的使用者通知生成者專案已經被成功處理。通知程序是使用共享的訊號和條件變數來實現的 方法

作用q.task_done( )

使用者使用此方法發出訊號,表示q.get( )的返回專案已經被處理。如果呼叫此方法的次數大於從佇列中刪除專案的數量,將引發valueerror異常

q.join( )

生產者呼叫此方法進行阻塞,直到佇列中所有的專案均被處理。阻塞將持續到佇列中的每個專案均呼叫q.task_done()方法為止

from multiprocessing import process, joinablequeue

import time, random

defproducer

(q, name, food)

:for i in

range(3

):res = f""

q.put(res)

time.sleep(random.randint(1,

3))print

(f"\033[1;35m:生產了:\033[0m"

) q.join(

)# 等待每個生產者自己放入的資料被消費者取完才結束該程序

defconsumer

(q, name)

:while

true

: res = q.get(

)if res ==

none

:break

time.sleep(random.randint(1,

3))print

(f"\033[1;36m吃了\033[0m"

) q.task_done(

)# 消費者每次取走乙個資料都傳送乙個task_done訊號,生產者那邊的計數相應減1

if __name__ ==

"__main__"

: q = joinablequeue(

)# 建立乙個物件

# 建立三個生產者

p1 = process(target=producer, args=

(q,"shawn"

,"香腸"))

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(

) p2.join(

) p3.join(

)?#原理分析 : 生產者生產資料, 假設乙個生產者生產3個資料帶佇列,每個相應的計數為3

?#消費者從佇列中取走資料的時候傳送task_done訊號給生產者,生產者的計數3-1,剩下兩個

?#消費者繼續取資料並傳送訊號,當生產者的計數為0,代表佇列已經取完了,這時q.join()就不再進行堵塞,生產者程序結束

?#而此時的消費者也已經沒有作用了,將消費者程序設定成守護程序,主程序等待生產者程序結束就結束,消費者程序自然被帶走

'''輸出

shawn:生產了:香腸0

海綿寶寶:生產了:雞0

章魚哥吃了香腸0

派大星:生產了:熱狗0

蟹老闆吃了熱狗0

shawn:生產了:香腸1

海綿寶寶:生產了:雞1

章魚哥吃了雞0

蟹老闆吃了香腸1

shawn:生產了:香腸2

派大星:生產了:熱狗1

章魚哥吃了雞1

蟹老闆吃了熱狗1

海綿寶寶:生產了:雞2

派大星:生產了:熱狗2

章魚哥吃了香腸2

蟹老闆吃了雞2

章魚哥吃了熱狗2

process finished with exit code 0

'''

python併發程式設計之多程序

今天學習了python併發程式設計之多程序 一 multiprocessing模組介紹 python中的多執行緒無法利用多核優勢,如果想要充分地使用多核cpu的資源 os.cpu count 檢視 在python中大部分情況需要使用多程序。python提供了multiprocessing。multi...

併發程式設計之多程序

程序理論 一 什麼是程序?程序 正在進行的乙個過程或者說乙個任務。而負責執行任務則是cpu。二 程序與程式的區別 程式僅僅只是一堆 而已,而程序指的是程式的執行過程。同乙個程式執行兩次,那也是兩個程序 三 併發與並行 並行處理 parallel processing 是計算機系統中能同時執行兩個或者...

python併發程式設計之多程序一

一,什麼是程序 程序是作業系統結構的基礎 是乙個正在執行的程式 計算機中正在執行的程式例項 可以分配給處理器並由處理器執行的乙個實體 二,程序與程式的區別 程序即執行中的程式,從中即可知,程序是在執行的,程式是非執行的,當然本質區別就是動態和靜態的區別。三,併發與並行解釋一 並行是指兩個或者多個事件...