2017-07-14 151 views
0

我想創建一個腳本克隆存儲庫,然後刪除本地回購的寫訪問。我有一個存儲repo對象的列表,我遍歷這個列表來克隆和鎖定repo。多處理for循環

我試着用multiprocessing加快這一任務,但它似乎確實有放緩下來......

def install(): 
    os.chdir(ROOT_DIR) 
    if os.path.isdir("./repos"): 
     for repo in getRepos(): 
      os.chdir(ROOT_DIR) 
      #Process(target=repo.clone()).start() 
      #Process(target=lock, args=(repo,)).start() 
      repo.clone() 
      lock(repo) 
    else: 
     os.mkdir("./repos") 
     install() 

兩個註釋行是我試圖創建subproccesses。我使用這個錯誤嗎?

子處理我的平均執行時間是:5.8秒 沒有子處理,我的平均執行時間是:4.5秒。

+1

你在每次循環迭代創建進程,每個進程將只在一個回購工作。你想理想地委派一個小組來處理他們的一大塊。下面的答案爲你解決了這個問題,但沒有解釋它的作用。 –

回答

2

試着這麼做:

from multiprocessing import Pool 

def processRepo(repo): 
    repo.clone() 
    lock(repo) 


def install(): 
    os.chdir(ROOT_DIR) 
    if os.path.isdir("./repos"): 
     pool = Pool() 
     pool.map(processRepo, getRepos()) 
     pool.close() 
     pool.join() 
    else: 
     os.mkdir("./repos") 
     install() 
+2

這很好,可能適用。但是解釋你在做什麼,肯定會幫助OP和未來的讀者。另外,包含'from multiprocessing import pool' –

+0

完美!這使得執行時間達到了3.4秒左右,爲什麼我不需要將repo參數傳遞給processRepo? – APorter1031

+1

@ APorter1031:因爲['pool.map()'](https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.Pool.map)。 – martineau