返回顶部

进程池

为什么使用进程池:

当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大

而且极其的浪费资源!

此时就可以用到multiprocessing模块提供的Pool方法。

进程池的创建:

 1 # -*- coding:utf8 -*-
 2 #Author: ZCB
 3 
 4 from multiprocessing import Pool
 5 import os,time,random
 6 
 7 def func(msg):
 8     t_start = time.time()
 9     print("%s 开始执行,进程号为%d "%(msg,os.getpid()))
10     time.sleep(random.random()*2)  #0-1
11     t_stop = time.time()
12     print(msg,"执行完毕,耗时%0.2f"%(t_stop-t_start))
13 
14 if __name__ == '__main__':
15     pool = Pool(3)  #池里最多开三个进程
16     for i in range(10):
17         pool.apply_async(func,(i,))
18 
19     print("{:=^20}".format("start"))
20     pool.close()  #关闭进程池后,poll 不再接受新的请求
21     pool.join() # 主进程要 等待 子进程执行完毕  它必须放在 close() 后
22     print("{:=^20}".format("end"))
23     '''
24     输出:
25     =======start========
26     0 开始执行,进程号为13148 
27     1 开始执行,进程号为7988 
28     2 开始执行,进程号为1916 
29     0 执行完毕,耗时0.34
30     3 开始执行,进程号为13148 
31     1 执行完毕,耗时0.44
32     4 开始执行,进程号为7988 
33     2 执行完毕,耗时1.09
34     5 开始执行,进程号为1916 
35     4 执行完毕,耗时0.83
36     6 开始执行,进程号为7988 
37     6 执行完毕,耗时0.58
38     7 开始执行,进程号为7988 
39     5 执行完毕,耗时0.85
40     8 开始执行,进程号为1916 
41     8 执行完毕,耗时0.30
42     9 开始执行,进程号为1916 
43     3 执行完毕,耗时1.99
44     7 执行完毕,耗时1.08
45     9 执行完毕,耗时1.71
46     ========end=========
47     '''
View Code

 

注意:pool.join()一定要放在 pool.close() 后,join()的目的是让主进程等待子进程执行完毕!

 

posted @ 2019-08-28 14:49  Zcb0812  阅读(144)  评论(0编辑  收藏  举报