进程间通信:进程之间必须需要中间件。
不同进程间内存是不共享的,要想实现两个进程间的数据交换
Queues:实现传输两个进程的数据
线程queue,访问数据只能在一个进程内进行线程与线程之间的访问。
进程queue,可以作为一个中间键来实现两个进程的数据交互,queue通过,pickle的方式序列化父进程将数据取,在反序列化给子进程,实际上是克隆了一分数据。
from multiprocessing import Process, Queue
def f(q): # 主进程传入数据 q.put([42, None, 'hello']) if __name__ == '__main__': # 实例化进程queue q = Queue() # 实例一个子进程,调用f,args=获取q.put克隆数据 p = Process(target=f, args=(q,)) # 执行进程 p.start() # 获取数据 print(q.get()) # 等待进程执行完 p.join()
Pipes:实现链接进程数据的传递
返回由管道连接的一对连接对象,默认情况下是双向的,与socket类似建立两端。
from multiprocessing import Process, Pipe
def f(conn): # 子进程发送父进程端 conn.send([42, None, 'hello from child']) print(conn.recv()) conn.close() if __name__ == '__main__': # 生成管道实例。 # 生成两个管道对象:parent_conn主,child_conn子 parent_conn, child_conn = Pipe() # 生成主进程 args=连接对象 p = Process(target=f, args=(child_conn,)) p.start() # 接收子进程端 print(parent_conn.recv()) parent_conn.send("Stupid son") p.join()
Managers:实现进程间数据的共享
manager返回的Managers()控制一个服务器进程,该进程包含Python对象,并允许其他进程使用代理操纵它们。
由manager()返回的管理器将支持类型列表、命令、名称空间、锁、锁、信号量、BoundedSemaphore、条件、事件、Barrier、队列、值和数组。
managers表面看的共享,实际上是克隆了n个数据后,在合成。
from multiprocessing import Process, Manager import os def f(d, l): # 存入每个进程PID到字典 d[os.getpid()] = os.getpid() # 每个进程放入进程ID l.append(os.getpid()) print(l) if __name__ == '__main__': # Manager() 赋值变量为 manager with Manager() as manager: # 生成一个字典.dict(),可在多个进程传递共享的字典 d = manager.dict() # 生成一个列表.list(),可在多个进程传递共享的列表 l = manager.list() p_list = [] for i in range(10): # 生成10个进程,args=(字典,列表) p = Process(target=f, args=(d, l)) # 执行进程 p.start() # 对象存放在空的列表内 p_list.append(p) # 等待结果 for res in p_list: res.join() print(d) print(l)