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模塊的進程池。關於進程池我將在另一片文章分享,請大家持續關注。