在講解多執行緒時,介紹了 3 種實現執行緒間通訊的機制,同樣 Python 也提供了多種實現程序間通訊的機制,下面我們一起來看看吧。
程序間通訊
我們知道程序之間資料是相互隔離的,要想實現程序間的通訊(IPC機制),就必須藉助於一些技術才可以,比如multiprocessing模組中的:佇列和管道,這兩種方式都是可以實現程序間資料傳輸的,由於佇列是管道+鎖的方式實現,所以我們著重研究佇列即可
佇列
概念介紹
建立共享的程序佇列,Queue是多程序安全的佇列,可以使用Queue實現多程序之間的資料傳遞。
大白話總結一下就是佇列支援多個人從佇列的一端放入資料,同樣支援多個人從佇列的另一端取資料
基本用法
Queue([maxsize]) # 建立共享的程序佇列 佇列底層使用管道和鎖定實現。# 引數 :maxsize是佇列中允許的最大項數。如果省略此引數,則無大小限制。
程式碼實現
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()