多进程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 # 一个进程结束,释放回进程池,下一个进程才可以开始

 

posted @ 2017-12-14 08:50  依哈  阅读(214)  评论(0编辑  收藏  举报