多进程Manager · 进程池
1 # 强大的Manage 2 # •以上实现的数据共享的方式只有两种结构Value和Array。 3 # Python中提供了强大的Manage专门用来做数据共享的,其支持的类型非常多,包括,Value, Array,list,dict, Queue, Lock等。 4 5 6 7 from multiprocessing import Process, Manager 8 def func(dt, lt): 9 for i in range(10): 10 key = 'arg' + str(i) 11 dt[key] = i * i 12 lt += range(11, 16) 13 if __name__ == "__main__": 14 manager = Manager() 15 dt = manager.dict() 16 lt = manager.list() 17 p = Process(target=func, args=(dt, lt)) 18 p.start() 19 p.join() 20 print(dt) 21 print(lt) 22 # 23 # 进程池 24 # Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求; 25 # 但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程。 26 # 下面我们先来看一个进程池非阻塞的例子: 27 28 29 30 import multiprocessing 31 import time 32 def fun(msg): 33 print("######start###### {0}".format(msg)) 34 time.sleep(3) 35 print("######end###### {0}".format(msg)) 36 if __name__ == "__main__": 37 pool = multiprocessing.Pool(processes=3) 38 for i in xrange(1, 6): 39 msg = "hello {0}".format(i) 40 pool.apply_async(fun, (msg,)) 41 print("##########start main#########") 42 pool.close() 43 pool.join() 44 #调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束 45 print("##########end main#########") 46 47 # 阻塞和非阻塞的区别: 48 # pool.apply_async 49 # 非阻塞,定义的进程池进程最大数可以同时执行 50 # pool.apply 51 # 一个进程结束,释放回进程池,下一个进程才可以开始