#模塊:Queue #導入方法:from multiprocessing import Process,Queue #模塊方法: from multiprocessing import Queue 藉助Queue解決生產者消費者模型 隊列是安全的。 q = Queue(num) num : 隊列的最大長度 q.get()# 阻塞等待獲取數據,若是有數據直接獲取,若是沒有數據,阻塞等待 q.put()# 阻塞,若是能夠繼續往隊列中放數據,就直接放,不能放就阻塞等待 q.get_nowait()# 不阻塞,若是有數據直接獲取,沒有數據就報錯 q.put_nowait()# 不阻塞,若是能夠繼續往隊列中放數據,就直接放,不能放就報錯 #使用方法:生產者消費者模型(主要是爲解耦) ################### from multiprocessing import Process,Queue import time def consumer(q,student): while 1: str=q.get() if str: print(student+"拿走了{}".format(str)) else: #若是該字符串爲空,表示生產者中止生產,則消費者程序退出,不然將會在q.get()中阻塞程序 break def producer(q,version): for i in range(20): info = version+"{}的蛋糕".format(i) q.put(info) q.put(None) #生產中止的標誌,告訴消費者再也不生產產品 if __name__ == '__main__': q=Queue() pCon=Process(target=consumer,args=(q,'學生')) pPro=Process(target=producer,args=(q,'粵牌')) pCon.start() pPro.start() #擴充,能夠在父進程中寫q.put(None)而不須要在生產者中寫,但必須保證生產者能完整生產全部產品,即父進程等待生產者進程的方法爲join #pPro.join() #q.put(None) #若是有多個生產者,可是最後的結束標誌須要根據消費者進程數進行設置,好比有2個消費者進程,則需q.put(None)兩次
###################################
from multiprocessing import Queue# 是用於多進程的隊列,就是專門用來作進程間通訊(IPC)。
import queue# 是用於同一進程內的隊列,不能作多進程之間的通訊安全
# q = queue.Queue()
# # 先進先出
# q.put(1)
# q.put(2)
# q.put(3)
# print(q.get())
# print(q.get())spa
# q = queue.LifoQueue()
# # 後進先出的隊列
# q.put(1)
# q.put(2)
# q.put(3)
# print(q.get())code
q = queue.PriorityQueue()
# 優先級隊列,put()方法接收的是一個元組(),第一個位置是優先級,第二個位置是數據
# 優先級若是是數字,直接比較數值
# 若是是字符串,是按照 ASCII 碼比較的。當ASCII碼相同時,會按照先進先出的原則
# q.put((1,'abc'))
# q.put((5,'qwe'))
# q.put((-5,'zxc'))
# print(q.get())
# print(q.get())
# print(chr(48))orm
#模塊:JoinableQueue #導入方法:from multiprocessing import Process,JoinableQueue #模塊方法: JoinableQueue是繼承Queue,因此可使用Queue中的方法 而且JoinableQueue又多了兩個方法 q=JoinableQueue() q.join()# 用於生產者。等待 q.task_done的返回結果,經過返回結果,生產者就能得到消費者當前消費了多少個數據 q.task_done() # 用於消費者,是指每消費隊列中一個數據,就給join返回一個標識。 #使用方法:生產者消費者模型 from multiprocessing import Process,JoinableQueue q = JoinableQueue() # 假設生產者生產了100個數據,join就能記錄下100這個數字。每次消費者消費一個數據,就必需要task_done返回一個標識,當生產者(join)接收到100個消費者返回來的標識的時候,生產者就能知道消費者已經把全部數據都消費完了。 from multiprocessing import Queue,Process import time def consumer(q,name,color): while 1: info = q.get() print('%s %s 拿走了%s \033[0m'%(color,name,info)) q.task_done() def producer(q,product): for i in range(20): info = product + '的娃娃%s號'%str(i) q.put(info) q.join()# 記錄了生產了20個數據在隊列中,此時會阻塞等待消費者消費完隊列中全部數據 if __name__ == '__main__': q = JoinableQueue(10) p_pro1 = Process(target=producer,args=(q,'島國米飯保你愛')) p_con1 = Process(target=consumer,args=(q,'alex','\033[31m')) p_con1.daemon = True# 把消費者進程設爲守護進程 p_con1.start() p_pro1.start() p_pro1.join()# 主進程等待生產者進程結束 # 程序有3個進程,主進程和生產者進程和消費者進程。 當主進程執行到35行代碼時,主進程會等待生產進程結束 # 而生產進程中(第26行)會等待消費者進程把全部數據消費完,生產者進程才結束。 # 如今的狀態就是 主進程等待生產者進程結束,生產者進程等待消費者消費完全部數據 # 因此,把消費者設置爲守護進程。 當主進程執行完,就表明生產進程已經結束,也就表明消費者進程已經把隊列中數據消費完 # 此時,主進程一旦結束,守護進程也就是消費者進程也就跟着結束。 整個程序也就能正常結束了。