1. 程式人生 > >python之程序間的通訊(queue,pipe,Manager)

python之程序間的通訊(queue,pipe,Manager)

不同程序間記憶體是不共享的,要想實現兩個程序間的資料交換,可以用多程序裡的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管道

上面兩種都是實現資料傳遞,現在實現資料共享,

可實現的資料型別有很多:

listdictNamespaceLockRLockSemaphoreBoundedSemaphoreConditionEventBarrierQueueValue 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)