python之程序間的通訊(queue,pipe,Manager)
阿新 • • 發佈:2018-11-10
不同程序間記憶體是不共享的,要想實現兩個程序間的資料交換,可以用多程序裡的Queue來解決:
Queues
使用方法跟threading裡的queue差不多,注意在執行的時候,queue是一個備份,而不是原來的queue,不過實現了資料共享。
from multiprocessing import Process, Queue #注意這裡要import Queue,之後的使用相當於備份一個queue,並且是一個同步的queue def f(q): q.put(25) if __name__ == '__main__': q = Queue() p = Process(target=f, args=(q,)) '''實現主程序和子程序的通訊,放入同一個佇列中''' p.start() print(q.get()) p.join()
Pipe管道
和佇列的功能差不多,實現兩個程序之間資料的傳遞:
'''管道pipe''' from multiprocessing import Process, Pipe def f(conn): conn.send('hello') #傳送hello print(conn.recv()) #收到牛逼 conn.close() #關閉 if __name__ == '__main__': parent_conn, child_conn = Pipe() #管道會產生兩個返回值 p = Process(target=f, args=(child_conn,)) #建立一個子程序 p.start() print(parent_conn.recv()) #收到'hello'" parent_conn.send('牛逼') #傳送牛逼 p.join()
Manager管道
上面兩種都是實現資料傳遞,現在實現資料共享,
可實現的資料型別有很多:
list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array
用法:
from multiprocessing import Process, Manager def f(d, l): d[1] = '1' d['2'] = 2 l.append(1) #追加一個1 # print(l) if __name__ == '__main__': d = Manager().dict() # 生成一個字典,可在多個程序間共享和傳遞 l = Manager().list(range(5)) # 列表 p_list = [] #程序列表 for i in range(10): p = Process(target=f, args=(d, l)) #迴圈10次每次建立一個程序 p.start() p_list.append(p) #加入程序列表裡 for res in p_list: #等所有程序結束 res.join() print(d) print(l)