生產者消費者模型(Queue,JoinableQueue模塊)

#模塊: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行)會等待消費者進程把全部數據消費完,生產者進程才結束。
    # 如今的狀態就是  主進程等待生產者進程結束,生產者進程等待消費者消費完全部數據
    # 因此,把消費者設置爲守護進程。  當主進程執行完,就表明生產進程已經結束,也就表明消費者進程已經把隊列中數據消費完
    # 此時,主進程一旦結束,守護進程也就是消費者進程也就跟着結束。    整個程序也就能正常結束了。
相關文章
相關標籤/搜索