python: multiprocessing多進程並行計算

簡介

多進程 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章