python中進程的通信:消息隊列。
我們知道進程是互相獨立的,各自運行在自己獨立的內存空間。
所以進程之間不共享任何變量。
我們要想進程之間互相通信,傳送一些東西怎么辦?
需要用到消息隊列!!
進程之間通過Queue進行通信
這是一個消息隊列,
q = Queue(n) 開一個能接收n條信息的隊列,不傳入默認動態延長
q.qsize() 返回隊列中消息的條數
q.empty() 隊列是否為空
q.get( block,timeout ) 取出消息,block默認為True,表示如果為空 一直等取出為止
timeout設置等多久,如果到時間還是空就拋出異常
q.get_nowait() 相當於q.get(False) 如果空 立刻拋出異常
q.put(item,block,timeout) item為向隊列傳送的內容
block默認為True 如果隊列滿了 就一直等有空位再送進去
timeout設置時間 到時間了沒送進去就拋出異常
q.put_nowait(item) 相當於q.put(False) 如果滿了 立即拋出異常
1 from multiprocessing import Queue 2 if __name__ == "__main__": 3 q = Queue(3) 4 q.put("消息1") 5 q.put("消息2") 6 print(q.full()) 7 q.put("消息3") 8 print(q.full()) 9
10 # 從消息隊列取數據 推薦兩種方法 1 捕獲異常 2 判斷
11
12 try : 13 q.put("消息4",True , 2) # 嘗試寫入,如果滿了 2秒后拋出異常
14 except: 15 print("已經滿了,現有消息%s條"%q.qsize()) 16 try : 17 q.put_nowait("消息4") # 嘗試寫入 如果滿了立即拋出異常
18 #相當於q.put(item,False)
19 except: 20 print("已經滿了,現有消息%s條"%q.qsize()) 21
22 if not q.full(): 23 q.put_nowait("消息4") 24
25 if not q.empty(): 26 for i in range(q.qsize()): 27 print(q.get_nowait())
在進程池當中使用Queue 需要使用Manager().Queue()
1 from multiprocessing import Manager,Pool 2 import os 3 def reader(q): 4 print("我是子進程%s,我的父進程是%s,我開始讀取消息"%( os.getpid(),os.getppid() ) ) 5 for i in range(q.qsize()): 6 print(q.get()) 7
8 def writer(q): 9 print("我是子進程%s,我的父進程是%s,我開始寫消息"%( os.getpid(),os.getppid() )) 10 for i in "DongGe": 11 q.put(i) 12
13
14 if __name__ == "__main__": 15 p = Pool() 16 q = Manager().Queue() 17 p.apply(writer,(q,)) 18 p.apply(reader,(q,)) 19 #關閉進程池 不再接收任務
20 p.close() 21 #阻塞 等待進程結束,必須在close之后
22 p.join() 23
24 print("結束")