1. 程式人生 > >PYTHON——多進程:進程間通信和數據共享

PYTHON——多進程:進程間通信和數據共享

cve 不同 連接 space event rlock child print 隊列

1、采用Queue隊列通信

from multiprocessing import Process, Queue

def f(q,n):
    q.put([42, n, hello])

if __name__ == __main__:
    q = Queue()
    p_list=[]
    for i in range(3):
        p = Process(target=f, args=(q,i))
        p_list.append(p)
        p.start()
    print(q.get())
    print(q.get())
    
print(q.get()) for i in p_list: i.join()

2、采用Pipe管道通信

‘‘‘
由PIPER()返回的兩個連接對象表示管道的兩端。
每個連接對象都有SeNe()和ReCVE()方法(除其他之外)。
註意,如果兩個進程(或線程)試圖同時從管道的同一端讀取或寫入數據,
那麽管道中的數據可能會損壞。
當然,在使用管道的不同端部的過程中不存在腐敗風險。
‘‘‘
from multiprocessing import Process, Pipe

def f(conn):
    conn.send([42, None, hello]) #子進程發送
conn.close() if __name__ == __main__: parent_conn, child_conn = Pipe() p = Process(target=f, args=(child_conn,)) p.start() print(parent_conn.recv()) # 主進程接收 prints "[42, None, ‘hello‘]" p.join()

3、采用Manager管理器對象通信

  Manager用於管理數據共享

‘‘‘
Manager()返回的管理器對象控制保存Python對象的服務器進程,
並允許其他進程使用代理操作它們。
Manager()返回的管理器將支持類型:list,dict, Namespace, Lock, RLock,
Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array
‘‘‘
from multiprocessing import Process, Manager

def f(d, l,n):
    d[n] = 1
    d[2] = 2
    d[0.25] = None
    l.append(n)
    print(l)

if __name__ == __main__:
    with Manager() as manager:  #with 類似 f = Open()格式
        d = manager.dict()
        l = manager.list(range(5))
        p_list = []
        for i in range(10):
            p = Process(target=f, args=(d, l,i))
            p.start()
            p_list.append(p)
        for res in p_list:
            res.join()

        print(d)
        print(l)

PYTHON——多進程:進程間通信和數據共享