簡介
多進程 vs 多線程
CPU密集型用多進程;IO密集型用多線程。
實例1
在科學計算中使用multiprocessing進行多進程並行計算。
- 前提:多個方法func1,func2,…,funcN是相互獨立的,可以並行計算。
- 當每個func的運行時間都較長時,利用多進程並行計算纔會極大提高運行效率。原因:使用多進程本身會有一定的時間開銷。
實例代碼
注意:通過sleep(t)
來模擬控制func運行消耗的時間
def func1(x):
print(f'當前進程:{os.getpid()},計算func1中......')
time.sleep(5)
return x**2
def func2(x):
print(f'當前進程:{os.getpid()},計算func2中......')
time.sleep(5)
return x**3
def test1():
"""單進程計算
"""
print('方法1:單進程計算')
print(f'當前主進程:{os.getpid()}')
start = time.time()
a = func1(2)
b = func2(2)
c = a + b
end = time.time()
t = end - start
print('c=', c)
print(f'計算完成,共用時:{t:.2f}s')
def test2():
"""利用multiprocessing實現多進程計算
"""
print('方法2:多進程計算')
print(f'當前主進程:{os.getpid()}')
start = time.time()
pool = Pool()
result1 = pool.apply_async(func1, args=(2, ))
result2 = pool.apply_async(func2, args=(2, ))
pool.close()
pool.join()
a = result1.get()
b = result2.get()
c = a + b
end = time.time()
t = end - start
print('c=', c)
print(f'計算完成,共用時:{t:.2f}s')
if __name__ == "__main__":
test1()
test2()
結果及分析
- 方法1計算過程中始終在同一個進程;方法2開始的進程與方法1相同,因爲都是從main()入口進去的。然後計算func1和func2時,就分別開了兩個新進程。符合預期。
- 多進程計算確實提高了運行效率,時間縮短了近3s;
- 理論上func1和func2並行計算,需要5s。實際有7s多,說明使用多進程是有一定固定開銷的。因此,單個func運行時間越多,多進程計算節省時間也越多。調節sleep時間,可證實這一結論。
方法1:單進程計算
當前主進程:15316
當前進程:15316,計算func1中......
當前進程:15316,計算func2中......
c= 12
計算完成,共用時:10.00s
方法2:多進程計算
當前主進程:15316
當前進程:14996,計算func1中......
當前進程:16708,計算func2中......
c= 12
計算完成,共用時:7.17s