程序間的通訊————IPC
阿新 • • 發佈:2018-11-08
""" IPC 指的是程序間通訊 之所以開啟子程序 肯定需要它幫我們完成任務 很多情況下 需要將資料返回給父程序 然而 程序記憶體是物理隔離的 解決方案: 1.將共享資料放到檔案中 就是慢 2.管道 subprocess中的那個 管道只能單向通訊 必須存在父子關係 3.共享一塊記憶體區域 得作業系統幫你分配 速度快 """ from multiprocessing import Process,Manager import time def task(dic): print("子程序xxxxx") # li[0] = 1 # print(li[0]) dic["name"] = "xx" if __name__ == '__main__': m = Manager() # li = m.list([100]) dic = m.dict({}) # 開啟子程序 p = Process(target=task,args=(dic,)) p.start() time.sleep(3) print(dic)
結果: 子程序xxxxx {'name': 'xx'}
""" 程序間通訊的另一種方式 使用queue queue 佇列 佇列的特點: 先進的先出 後進後出 就像扶梯 """ from multiprocessing import Process,Queue # 基礎操作 必須要掌握的 # 建立一個佇列 # q = Queue() # # 存入資料 # q.put("hello") # q.put(["1","2","3"]) # q.put(1) # # 取出資料 # print(q.get()) # print(q.get())# print(q.get()) # print(q.get()) # 阻塞操作 必須掌握 # q = Queue(3) # # # 存入資料 # q.put("hello",block=False) # q.put(["1","2","3"],block=False) # q.put(1,block=False) # # 當容量滿的時候 再執行put 預設會阻塞直到執行力了get為止 # # 如果修改block=False 直接報錯 因為沒地方放了 # # q.put({},block=False) # # # # # 取出資料 # print(q.get(block=False)) # print(q.get(block=False)) # print(q.get(block=False)) # # 對於get 當佇列中中沒有資料時預設是阻塞的 直達執行了put # # 如果修改block=False 直接報錯 因為沒資料可取了 # print(q.get(block=False)) # 瞭解 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)) #引發錯誤行
結果: q q2 q3 Traceback (most recent call last): File "F:/oldboy課程記錄/day36/程式碼/6.程序間通訊2.py", line 59, in <module> print(q.get(timeout=3)) File "F:\Python\lib\multiprocessing\queues.py", line 105, in get raise Empty queue.Empty