1. 程式人生 > >程序之間通訊

程序之間通訊

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佇列

佇列的特點:

先進先出

後進後出

就放扶梯一樣

from
multiprocessing 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))