Python 多程序_通訊
阿新 • • 發佈:2021-01-11
1. 多程序佇列 , 只能實現資料互動,不能共享
from multiprocessing import Process,Queue import time import uuid class MyProcess(Process): def __init__(self,q): super(MyProcess,self).__init__() self.q=q def run(self): self.q.put(uuid.uuid1()) if __name__ == '__main__': q=Queue() #程序佇列 """由於每個程序都是獨立的空間,所以必須將一個佇列傳入到每個程序裡面共享""" p = MyProcess(q) p2= MyProcess(q) p.start() p2.start() print(q.get()) print(q.get())
2. 雙向管道,只能實現資料互動,不能共享
from multiprocessing import Process,Queue,Pipe import time import uuid class MyProcess(Process): def __init__(self,conn): super(MyProcess,self).__init__() self.conn=conn def run(self): self.conn.send('hello') data=self.conn.recv() # 沒有 send之前阻塞 print(data) if __name__ == '__main__': conn1,conn2=Pipe() # 管道 """由於每個程序都是獨立的空間,所以必須將一個佇列傳入到每個程序裡面共享""" p= MyProcess(conn1) p.start() #====================================== data = conn2.recv() # 沒有 send之前阻塞 print(data) conn2.send('ok')
3. Managers, 支援資料共享
from multiprocessing import Process,Queue,Pipe,Manager import time import uuid class MyProcess(Process): def __init__(self,dic,li,num): super(MyProcess,self).__init__() self.dic=dic self.li=li self.num=num def run(self): self.dic['num%s'%self.num]=self.num self.li.append(self.num) if __name__ == '__main__': with Manager() as manager: dic=manager.dict() # 建立多程序共享字典 li =manager.list() # 建立多程序共享列表 process_list=[] for i in range(5): p=MyProcess(dic,li,i) p.start() process_list.append(p) for p in process_list: p.join() print(dic) print(li)
4.
5.
6.
7.
8.
9.