python程序間通訊Queue工作過程詳解
阿新 • • 發佈:2020-01-09
Process之間有時需要通訊,作業系統提供了很多機制來實現程序間的通訊。
1. Queue的使用
可以使用multiprocessing模組的Queue實現多程序之間的資料傳遞,Queue本身是一個訊息列隊程式,首先用一個小例項來演示一下Queue的工作原理:
import multiprocessing q = multiprocessing.Queue(3) # 初始化的Queue物件,最多能put三條訊息 q.put("訊息1") q.put("訊息2") print(q.full()) q.put("訊息3") print(q.full()) # 因為訊息列隊已滿下面的try都會丟擲異常,第一個try會等待2秒後再丟擲異常,第二個Try會立刻丟擲異常 try: q.put("訊息4",True,2) except: print("訊息已滿,現有的訊息為%d" % (q.qsize())) try: q.put_nowait("訊息4") except: print("訊息已滿,現有的訊息為%d" % (q.qsize())) # 推薦的方式,先判斷訊息列隊是否已滿,再寫入 if not q.full(): q.put_nowait("訊息4") # 讀取訊息時,先判斷訊息列隊是否為空,再讀取 if not q.empty(): for i in range(q.qsize()): print(q.get_nowait())
執行結果:
False True 訊息已滿,現有的訊息為3 訊息已滿,現有的訊息為3 訊息1 訊息2 訊息3
說明:
初始化Queue()物件時(例如:q=Queue()),若括號中沒有指定最大可接收的訊息數量,或數量為負值,那麼就代表可接受的訊息數量沒有上限(直到記憶體的盡頭);
- Queue.qsize():返回當前佇列包含的訊息數量;
- Queue.empty():如果佇列為空,返回True,反之False ;
- Queue.full():如果佇列滿了,返回True,反之False;
- Queue.get([block[,timeout]]):獲取佇列中的一條訊息,然後將其從列隊中移除,block預設值為True
1)如果block使用預設值,且沒有設定timeout(單位秒),訊息列隊如果為空,此時程式將被阻塞(停在讀取狀態),直到從訊息列隊讀到訊息為止,如果設定了timeout,則會等待timeout秒,若還沒讀取到任何訊息,則丟擲"Queue.Empty"異常;
2)如果block值為False,訊息列隊如果為空,則會立刻丟擲"Queue.Empty"異常;
- Queue.get_nowait():相當Queue.get(False);
- Queue.put(item,[block[,timeout]]):將item訊息寫入佇列,block預設值為True;
1)如果block使用預設值,且沒有設定timeout(單位秒),訊息列隊如果已經沒有空間可寫入,此時程式將被阻塞(停在寫入狀態),直到從訊息列隊騰出空間為止,如果設定了timeout,則會等待timeout秒,若還沒空間,則丟擲"Queue.Full"異常;
2)如果block值為False,訊息列隊如果沒有空間可寫入,則會立刻丟擲"Queue.Full"異常;
Queue.put_nowait(item):相當Queue.put(item,False);
2. Queue例項
我們以Queue為例,在父程序中建立兩個子程序,一個往Queue裡寫資料,一個從Queue裡讀資料:
import multiprocessing import time import random def write(q): """忘佇列中寫入資料""" for value in "ABCD": print("Put %s to queue" % (value)) q.put(value) time.sleep(random.random()) def read(q): """讀取佇列中的資料""" while True: if not q.empty(): value = q.get(True) print("Get %s from queue" % (value)) time.sleep(random.random()) else: break if __name__ == "__main__": q = multiprocessing.Queue() pw = multiprocessing.Process(target=write,args=(q,)) pr = multiprocessing.Process(target=read,)) pw.start() pw.join() pr.start() pr.join() print('') print('所有資料都寫入並且讀完')
執行結果:
Put A to queue Put B to queue Put C to queue Put D to queue Get A from queue Get B from queue Get C from queue Get D from queue 所有資料都寫入並且讀完
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。