1. 程式人生 > >python--利用concurrent.futures 來實現真正的平行計算

python--利用concurrent.futures 來實現真正的平行計算

    由於python的全域性解釋鎖(GIL)使得我們無法使用執行緒進行真正的平行計算,因此,我們把總計算量分配到多個獨立的任務中,並在多個CPU和欣賞同時執行任務是很難實現的。

    為解決該類問題,提高程式碼執行速率,我們嘗試可以引入concurrent.futures模組,來利用另外一個名叫multiprocessing的內建模組實現這種需求。該做法會以子程式的形式,平行地執行多個直譯器,從而令python程式能夠利用多核心CPU來提升執行速度。由於子程序與主直譯器相分離,所以,他們的全域性直譯器鎖也是相互獨立的。每個子程序都可以完整的利用一個CPU核心,而且這些子程序都與主程序之間有著聯絡,通過這條聯絡渠道,子程序可以接收主程序發過來的指令,並把計算結果返回給主程序。

    例如,我們首先定義一個函式:

def demo(info):
    a, b = info
    low = min(a, b)
    for i in range(low,0,-1):
        if a % i == 0 and b % i == 0:
            return i 

接著,我們分別計算沒有做平行計算和做了平行計算所需要的時間:

首先,我們先匯入一個庫:

from concurrent.futures import ProcessPoolExecutor

接著:

然後執行程式之後,我們會發現,直接執行所耗時間大概為14秒,然後雙核計算為7秒

另外,關於multiprocessing開銷較大的原因:主程序和子程序之間,必須進行序列化和反序列化操作,而程式中的大量開銷,正是由這些操作所引發的。