1. 程式人生 > >程序間的通訊————IPC

程序間的通訊————IPC

"""
    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