最近在用Python處理公共的圖像數據庫,由於數據量比較大,一張張串行處理圖片時間太久了。因此,決定採用並行的方式來充分利用主機上的CPU來實現處理過程的加速,可以大大減少總的處理時間。
這裏採用的是concurrent.futures模塊,它可以利用multiprocessing實現真正的平行計算。
核心原理是:concurrent.futures會以子進程的形式,平行的運行多個python解釋器,從而令python程序可以利用多核CPU來提升執行速度。由於子進程與主解釋器相分離,所以他們的全局解釋器鎖也是相互獨立的。每個子進程都能夠完整的使用一個CPU內核。
具體實現起來也非常簡單,代碼如下。主機有多少CPU核心,就會啓動多少Python進程並行處理。
import concurrent.futures
def function(files):
# To do what you want
# files: file list that you want to process
if __name__ == '__main__':
with concurrent.futures.ProcessPoolExecutor() as executor:
executor.map(function, files)
改成並行處理後,我的12塊CPU滿負荷運行,處理速度明顯加快。