Python版本:3.70;操作系统:Windows10
(出发点:通过multiprocessing模块用最简单的方式来让你提高程序运行效率)
来了更好的感受到multiprocessing模块提升运行效率的效果,将提出一个问题,并采用两种不同解决方式进行对比来说明。
需解决问题:计算变量i从0开始,不断+1,直到i=20000000,并重复3次。
(一)普通情况
import time
def hello(num):
i = 0
while i < num:
i+=1
print(i)
if __name__ == '__main__':
ts = time.time()
hello(20000000) # 第一次计算
hello(20000000) # 第二次计算
hello(20000000) # 第三次计算
te = time.time()
print("using time: "+str(te - ts)+"s")
运行结果:
(二)使用multiprocessing模块
import multiprocessing
import time
def hello(num):
i = 0
while i < num:
i+=1
print(i)
if __name__ == '__main__':
ts = time.time()
i = 3
while i >= 1:
p = multiprocessing.Process(target=hello,args=(20000000, )) # target=需调用函数名,args=函数参数
p.start() # 启动进程
i-=1
p.join()
te = time.time()
print("using time: "+str(te - ts)+"s")
运行结果:
注意事项:
1、如果是windows系统, multiprocessing.Process需在if __name__ == '__main__':下使用
2、args后面的参数必须是tuple类型,在这里可以认为是为整数参数20000000添加了小括号和逗号
3、这里的p.join()的对象是在while循环中i=1时的p,也就是最后一次循环的p,所以这里是等待最后一次p结束后,会运行下一条语句,所以如果前面已经开始的进程需要的运行时间比后面的要长得多,就有可能出现串行的情况。比如下图,我将[4*10000000,0.5*10000000,1*10000000]按顺序迭代作为函数参数输入,你会发现第一个开始运行的以4*10000000作为参数的进程却最后输出,并且还在using time: 1.69600...这条输出语句的下面。
这是因为4*10000000的计算量远大于其他两个(0.5*10000000和1*10000000)的计算量,所以计算花费的时间也比较多。因此,在最后一条语句(1*10000000)计算完成后,p.join()就识别出此时的p函数(以1*10000000为参数的函数)结束了,可以进行下一条语句了,所以就输出了using time: 1.69600...,但第一个p函数(以4*10000000为参数的函数,即第一条开始的进程)还在计算中,所以就出现了串行现象。
所以,如果你想要让你规定的全部进程结束的后再进行下一条语句,就需要使用multiprocessing模块的进程池。关于进程池我将在另一片文章分享,请大家持续关注。