day10-进程数据共享、进程池
一、进程数据共享
1 # ----------------------------------------- 2 # 数据传递 3 from multiprocessing import Process, Pipe 4 5 def f(conn): 6 # 发送消息给父进程 7 conn.send([42, None, 'hello']) 8 conn.send("Just for test") 9 print(conn.recv()) 10 conn.close() 11 12 if __name__ == '__main__': 13 # 管道生成返回两个实例,双向,角色可调换 14 # 这边把第1个作为父连接,第2个作为子连接 15 parent_conn, child_conn = Pipe() 16 p = Process(target=f, args=(child_conn,)) 17 p.start() 18 # 接收子进程的消息 19 print(parent_conn.recv()) 20 print(parent_conn.recv()) 21 parent_conn.send("from main process") 22 p.join() 23 24 # ----------------------------------------- 25 # 数据共享 26 # manager自动加锁,默认两个进程无法同时修改一份数据 27 from multiprocessing import Process, Manager 28 import os 29 30 31 def f(d, l): 32 d[os.getpid()] = os.getpid() 33 l.append(os.getpid()) 34 print(l) 35 36 if __name__ == '__main__': 37 with Manager() as manager: 38 # 声明manager字典 39 d = manager.dict() 40 # 声明manager列表 41 l = manager.list(range(5)) 42 p_list = [] 43 for i in range(10): 44 # 生成10个进程 45 p = Process(target=f, args=(d, l)) 46 p.start() 47 p_list.append(p) 48 # 等待进程结束 49 for res in p_list: 50 res.join() 51 print(d) 52 print(l)
二、进程池
1 # ------------------------------------------- 2 # 进程锁 3 from multiprocessing import Process, Lock 4 5 6 def f(l, i): 7 # 加锁 8 l.acquire() 9 try: 10 print("hello word", i) 11 finally: 12 # 释放锁 13 l.release() 14 15 if __name__ == "__main__": 16 # 定义锁 17 lock = Lock() 18 for num in range(10): 19 Process(target=f, args=(lock, num,)).start() 20 21 # 导入进程池模块pool 22 from multiprocessing import Pool 23 import time, os 24 25 26 def Foo(i): 27 time.sleep(2) 28 # 进程号 29 print("in process", os.getpid()) 30 return i+100 31 32 33 def Bar(arg): 34 print('-->exec done:', arg, os.getpid()) 35 36 if __name__ == "__main__": 37 # 允许进程池同时放入5个进程,给CPU运行 38 pool = Pool(processes=5) 39 for i in range(10): 40 # 同步执行,串行 41 # pool.apply(func=Foo, args=(i,)) 42 # 异步执行,并行 43 # pool.apply_async(func=Foo, args=(i,)) 44 # callback回调, Foo函数执行完毕之后调用Bar函数,回调函数由主进程调用 45 pool.apply_async(func=Foo, args=(i,), callback=Bar) 46 47 print('end') 48 pool.close() 49 # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。 50 pool.join()

浙公网安备 33010602011771号