python多進程之間的通信:消息隊列Queue


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("結束")

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM