进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的
进程通信
队列
import multiprocessing def run(q): q.put('hello') q.put('mainprocess') print('subprocess q ID:',id(q)) if __name__ == '__main__': q=multiprocessing.Queue()#用于进程间通信的队列 t=multiprocessing.Process(target=run,args=(q,)) t.start() t.join() print('main process q ID:',id(q)) print(q.get()) print(q.get()) ''' subprocess q ID: 2359100652232 main process q ID: 2025858869736 hello mainprocess '''
管道
import multiprocessing def foo(conn): data=conn.recv() print(data) conn.send('subprocess conn id is %s'%(id(conn))) print('this is subprocess') if __name__ == '__main__': parent_conn,child_conn=multiprocessing.Pipe()#用管道PIPE得到类似tcp的conn,从而进行双向通信(因为不涉及网络传输,所以可以不用转码) t=multiprocessing.Process(target=foo,args=(child_conn,)) t.start() parent_conn.send('hello subprocess,main proess conn id is %s'%(id(parent_conn))) print(parent_conn.recv()) ''' hello subprocess,main proess conn id is 2188825603096 this is subprocess subprocess conn id is 2818361495736 '''
共享数据
进程间数据是独立的,可以借助于队列或管道实现通信,二者都是基于消息传递的
虽然进程间数据独立,但可以通过Manager实现数据共享,事实上Manager的功能远不止于此
Manager支持的类型有list,dict,Namespace,Lock,RLock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array
import multiprocessing def fun(d,l,i): d[i]='2' l.append(i) print('son process id',id(d),id(l)) if __name__ == '__main__': with multiprocessing.Manager() as manager: d=manager.dict() l=manager.list() print('main process d is %s and l is %s'%(d,l)) print('main process d ID is %s and l ID is %s'%(id(d),id(l))) p_list=[] for i in range(6): t=multiprocessing.Process(target=fun,args=(d,l,i)) p_list.append(t) t.start() for t in p_list: t.join() print(d) print(l) ''' main process d is {} and l is [] main process d ID is 1304911555608 and l ID is 1304915564584 son process id 1782039016000 1782042035144 son process id 1888584888896 1888587908152 son process id 2214483358104 2214486381456 son process id 1443060675080 1443063694392 son process id 2225121096200 2225123677408 son process id 2640201478664 2640204502016 {0: '2', 1: '2', 2: '2', 3: '2', 4: '2', 5: '2'} [0, 1, 2, 3, 4, 5] '''