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)