程序之間通訊
阿新 • • 發佈:2018-11-09
IPC 指的是程序間通訊
之所以開啟子程序 ,肯定需要他幫我們完成任務,很多情況下,需要將資料返回給父程序。
然而程序記憶體是物理隔離的
解決方案:
1.將共享資料放在檔案中,就是慢
2.管道 subprocess 中那個管道只能單向通訊,必須有父子關係
3.共享一塊記憶體區域 得作業系統幫你分配,速度快
第三鍾實現Manager
from multiprocessing import Process,Manager import time def task(dic): print("子程序") dic["a"] = 1 if __name__ == '__main__': # Manager 繼承之間專用的與外界 m = Manager()#開闢專用記憶體空間 dic = m.dict({})#在這塊記憶體空間生成一個字典 # 生成公共區域的字典 p = Process(target=task,args=(dic,)) p.start() time.sleep(3)#因為程序開啟速度較為慢,所以先執行父程序 print(dic["a"])
程序之間的通訊另一種方式 使用queue
queue佇列
佇列的特點:
先進先出
後進後出
就放扶梯一樣
frommultiprocessing import Process,Queue def task(queue): for i in range(3): queue.put(i)#將資料放入佇列 if __name__ == '__main__': q = Queue() p = Process(target=task,args = (q,)) p.start() print(q.get())#取值規範先進先出 print(q.get()) print(q.get())
同時queue佇列中存取值,存在阻塞,也可通過修改引數來使得
from multiprocessing import Process,Queue import time q = Queue(3)#限定管道中可以存放多少屬性 q.put("hello",block=False)#當管道已經存滿的話,存放是否接受阻塞,True接受阻塞,False不接受阻塞 q.put("world",block=False) q.put("nice",block=False) # q.put("12333",block=False)#放不下的直接異常 queue.Full print(q.get(block= False)) print(q.get(block= False)) print(q.get(block= False)) # print(q.get(block=False))#當管道被被取空的話,是否接受阻塞,True接受阻塞,False不接受阻塞 #異常 _queue.Empty
timeout屬性表示願意等待的時間
# 瞭解 q = Queue(3) q.put("q",timeout=3) q.put("q2",timeout=3) q.put("q3",timeout=3) # 如果滿了 願意等3秒 如果3秒後還存不進去 就炸 # q.put("q4",timeout=3) print(q.get(timeout=3)) print(q.get(timeout=3)) print(q.get(timeout=3)) # 如果沒了 願意等3秒 如果3秒後還取不到資料 就炸 print(q.get(timeout=3))