1. 程式人生 > 實用技巧 >python中生產者消費者模式

python中生產者消費者模式

原文連結:https://blog.csdn.net/mfansheng/article/details/99535816

•生產者消費者問題(英語:Producer-consumer problem),也稱有限緩衝問題(英語:Bounded-buffer problem),是一個多執行緒同步問題的經典案例。

•該問題描述了兩個共享固定大小緩衝區的執行緒——即所謂的“生產者”和“消費者”——在實際執行時會發生的問題。

•生產者的主要作用是生成一定量的資料放到緩衝區中,然後重複此過程。

•消費者也在緩衝區消耗這些資料。

•該問題的關鍵就是要保證生產者不會在緩衝區滿時加入資料,消費者也不會在緩衝區中空時消耗資料。

建立思路:

•建立一個共享區,共享區的容量為10(使用整型count變數模擬)

•2個生產者,每個生產者消耗隨機的時間單位生產1件商品並放入共享區(count自增1模擬),當共享區已滿,生產者停止放入共享區,執行緒進入block阻塞狀態,等待消費者執行緒喚醒。

•5個消費者,每個消費者使用隨機的時間單位每次從共享區獲取1件商品(count自減1模擬),當共享區已空,消費者停止從共享區獲取,執行緒進入block阻塞狀態,等待生產者執行緒喚醒。

程式碼實現:

import threading   #匯入多執行緒模組
import time        #匯入時間模組
import random      #
匯入隨機模組 count = 0 #使用共享區模擬變數 condition = threading.Condition() #建立條件物件 #建立生產者執行緒類 class Producer(threading.Thread): def __init__(self, threadName): #構造方法 threading.Thread.__init__(self) self.threadName = threadName pass def run(self): global count #引用全域性變數
while True: if condition.acquire(): #使用條件物件獲取鎖並鎖定 if count >= 10: # 判斷共享變數是否已達到上限 print("共享區已滿,生產者Producer執行緒進入阻塞Block狀態,停止放入!") condition.wait() #當前執行緒進入阻塞狀態 pass else: count += 1 #共享變數自增1 msg = time.ctime() + ' ' + self.threadName + '生產了1件商品放入共享區,共享區商品總數: ' + str(count) print(msg) condition.notify() #喚醒其消費者執行緒 pass condition.release() #解除鎖定 time.sleep(random.randrange(10)/5) #隨機休眠n秒 class Customer(threading.Thread): #消費者執行緒類 def __init__(self, threadName): #構造方法 threading.Thread.__init__(self) self.threadName = threadName pass def run(self): global count #引用全域性變數 while True: if condition.acquire(): #使用條件物件獲取鎖並鎖定 if count < 1: # 判斷共享變數是否為空 print("共享區以空,消費者Customer執行緒進入阻塞Block狀態,停止獲取!") condition.wait() #當前執行緒進入阻塞狀態 pass else: count -= 1 #共享變數自減1 msg = time.ctime() + ' ' + self.threadName + '消費了一件商品,共享區商品總數: ' + str(count) print(msg) condition.notify() #喚醒其消費者執行緒 pass condition.release() #解除鎖定 time.sleep(random.randrange(10)) #隨機休眠n秒 pass pass pass pass if __name__ == '__main__': for i in range(2): p = Producer('[生產者-0' + str(i+1) + ']') p.start() pass for i in range(5): c = Customer('消費者-' + str(i+1) + ']') c.start()

執行結果:

 
Wed Aug 14 08:14:49 2019 [生產者-01]生產了1件商品放入共享區,共享區商品總數: 1
 
Wed Aug 14 08:14:49 2019 [生產者-02]生產了1件商品放入共享區,共享區商品總數: 2
 
Wed Aug 14 08:14:49 2019 消費者-1]消費了一件商品,共享區商品總數: 1
 
Wed Aug 14 08:14:49 2019 消費者-2]消費了一件商品,共享區商品總數: 0
 
共享區以空,消費者Customer執行緒進入阻塞Block狀態,停止獲取!
 
共享區以空,消費者Customer執行緒進入阻塞Block狀態,停止獲取!
 
共享區以空,消費者Customer執行緒進入阻塞Block狀態,停止獲取!
 
共享區以空,消費者Customer執行緒進入阻塞Block狀態,停止獲取!
 
Wed Aug 14 08:14:49 2019 [生產者-01]生產了1件商品放入共享區,共享區商品總數: 1
 
Wed Aug 14 08:14:50 2019 [生產者-01]生產了1件商品放入共享區,共享區商品總數: 2
 
Wed Aug 14 08:14:51 2019 [生產者-02]生產了1件商品放入共享區,共享區商品總數: 3
 
Wed Aug 14 08:14:51 2019 消費者-3]消費了一件商品,共享區商品總數: 2
 
Wed Aug 14 08:14:51 2019 消費者-3]消費了一件商品,共享區商品總數: 1
 
Wed Aug 14 08:14:52 2019 [生產者-01]生產了1件商品放入共享區,共享區商品總數: 2
 
Wed Aug 14 08:14:52 2019 [生產者-01]生產了1件商品放入共享區,共享區商品總數: 3
 
Wed Aug 14 08:14:53 2019 [生產者-02]生產了1件商品放入共享區,共享區商品總數: 4
 
Wed Aug 14 08:14:54 2019 [生產者-01]生產了1件商品放入共享區,共享區商品總數: 5
 
Wed Aug 14 08:14:54 2019 [生產者-02]生產了1件商品放入共享區,共享區商品總數: 6
 
Wed Aug 14 08:14:54 2019 消費者-2]消費了一件商品,共享區商品總數: 5
 
Wed Aug 14 08:14:55 2019 [生產者-02]生產了1件商品放入共享區,共享區商品總數: 6
 
Wed Aug 14 08:14:55 2019 [生產者-02]生產了1件商品放入共享區,共享區商品總數: 7
 
Wed Aug 14 08:14:55 2019 [生產者-01]生產了1件商品放入共享區,共享區商品總數: 8
 
Wed Aug 14 08:14:55 2019 [生產者-02]生產了1件商品放入共享區,共享區商品總數: 9
 
Wed Aug 14 08:14:57 2019 [生產者-02]生產了1件商品放入共享區,共享區商品總數: 10
 
共享區已滿,生產者Producer執行緒進入阻塞Block狀態,停止放入!
 
共享區已滿,生產者Producer執行緒進入阻塞Block狀態,停止放入!
 
Wed Aug 14 08:14:57 2019 消費者-5]消費了一件商品,共享區商品總數: 9
 
Wed Aug 14 08:14:58 2019 消費者-1]消費了一件商品,共享區商品總數: 8
 
Wed Aug 14 08:14:58 2019 消費者-1]消費了一件商品,共享區商品總數: 7
 
Wed Aug 14 08:14:58 2019 消費者-2]消費了一件商品,共享區商品總數: 6
 
Wed Aug 14 08:14:58 2019 [生產者-02]生產了1件商品放入共享區,共享區商品總數: 7
 
Wed Aug 14 08:14:59 2019 [生產者-01]生產了1件商品放入共享區,共享區商品總數: 8
 
Wed Aug 14 08:14:59 2019 消費者-4]消費了一件商品,共享區商品總數: 7
 
Wed Aug 14 08:14:59 2019 [生產者-01]生產了1件商品放入共享區,共享區商品總數: 8
 
Wed Aug 14 08:14:59 2019 消費者-3]消費了一件商品,共享區商品總數: 7
 
Wed Aug 14 08:14:59 2019 消費者-3]消費了一件商品,共享區商品總數: 6
 
Wed Aug 14 08:15:00 2019 [生產者-02]生產了1件商品放入共享區,共享區商品總數: 7
 
Wed Aug 14 08:15:00 2019 [生產者-02]生產了1件商品放入共享區,共享區商品總數: 8
 
Wed Aug 14 08:15:00 2019 [生產者-01]生產了1件商品放入共享區,共享區商品總數: 9