在講解多線程時,介紹了 3 種實現線程間通訊的機制,一樣 Python 也提供了多種實現進程間通訊的機制,下面咱們一塊兒來看看吧。安全
進程間通訊多線程
咱們知道進程之間數據是相互隔離的,要想實現進程間的通訊(IPC機制),就必須藉助於一些技術才能夠,好比multiprocessing模塊中的:隊列和管道,這兩種方式都是能夠實現進程間數據傳輸的,因爲隊列是管道+鎖的方式實現,因此咱們着重研究隊列便可ide
隊列函數
概念介紹線程
建立共享的進程隊列,Queue是多進程安全的隊列,可使用Queue實現多進程之間的數據傳遞。code
大白話總結一下就是隊列支持多我的從隊列的一端放入數據,一樣支持多我的從隊列的另外一端取數據對象
基本用法隊列
Queue([maxsize]) # 建立共享的進程隊列 隊列底層使用管道和鎖定實現。# 參數 :maxsize是隊列中容許的最大項數。若是省略此參數,則無大小限制。進程
代碼實現ip
from multiprocessing import Queue
q=Queue(3) # 建立一個最大隻能容納3個數據的隊列"""
經常使用方法
put ,get ,put_nowait,get_nowait,full,empty
"""q.put(3) # 往隊列中存放數據q.put(3)
q.put(3)
q.put(3) # 若是隊列已經滿了,程序就會停在這裏,等待數據被別人取走,再將數據放入隊列。若是隊列中的數據一直不被取走,程序就會永遠停在這裏。try:
q.put_nowait(3) # 可使用put_nowait,若是隊列滿了不會阻塞,可是會由於隊列滿了而報錯。except: # 所以咱們能夠用一個try語句來處理這個錯誤。這樣程序不會一直阻塞下去,可是會丟掉這個消息。 print('隊列已經滿了') # 所以,咱們再放入數據以前,能夠先看一下隊列的狀態,若是已經滿了,就不繼續put了。print(q.full()) # 判斷隊列中數據是否已存放滿了print(q.get()) # 從隊列中獲取數據print(q.get())
print(q.get())
print(q.get()) # 同put方法同樣,若是隊列已經空了,那麼繼續取就會出現阻塞。try:
q.get_nowait(3) # 可使用get_nowait,若是隊列滿了不會阻塞,可是會由於沒取到值而報錯。except: # 所以咱們能夠用一個try語句來處理這個錯誤。這樣程序不會一直阻塞下去。 print('隊列已經空了')
print(q.empty()) # 判斷隊列中數據是否已經被所有取出
基於隊列實現進程間通訊
import timefrom multiprocessing import Process, Queuedeff(q): q.put('hello') #調用主函數中p進程傳遞過來的進程參數 put函數爲向隊列中添加一條數據。if name == 'main':
q = Queue() # 建立一個Queue對象 p = Process(target=f, args=(q,)) #建立一個進程 p.start() print(q.get()) # 從隊列中獲取數據 p.join()from multiprocessing import Queue,Processdefproducer(q): q.put('hello big baby!')defconsumer(q): print(q.get())if __name__ == '__main__': q = Queue() p = Process(target=producer,args=(q,)) p.start() p1 = Process(target=consumer,args=(q,)) p1.start()