043进程通信和数据共享
内容:进程通信1、Pipes;2、Queue,以及例子和练习
不同进程的通信有两种,1、是Pipes,2、是Queue ,一般不用Pipes
##########################################
1、Queue实现进程通信
通过创建线程的时候传递数据
print(os.getppid()) # os.getppid()获取父进程的id print(os.getpid()) # os.getpid()或者该进程的id 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()
信息在Queue里面通信,这里可以看出,需要的信息通过进程加入到 q 里面后,就可以通过 q 操作。
##########################################################################
2、Pipes实现进程通信
步骤:1)建立Pipe对象,拿到两个进程通信对象
2)通过参数传递,把子进程通信对象发送给子进程
3)通过send和recv通信
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()) p.join()
###################################################
数据共享
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 open() as f == 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()
线程和进程池
http://www.cnblogs.com/yuanchenqi/articles/5733873.html
——多线程(threading模块)