2015-05-28 54 views
6

我一直在使用工作人員池實施python的多處理庫。我實現了下面的代碼Python多處理導致許多殭屍進程

import main1 
t1 = time.time() 
p = Pool(cores) 
result = p.map(main1, client_list[client]) 
if result == []: 
    return [] 
p.close() 
p.join() 
print "Time taken in performing request:: ", time.time()-t1 
return shorted(result) 

但是,運行一段時間後,我得到了很多運行我的應用程序的後臺進程。這裏是幹什麼的ps aux爲我的應用程序

Snapshot showing all the zombie processes

現在,經過一個快照,我已經閱讀了很多關於計算器類似的問題,如how to kill zombie processes created by multiprocessing module?這就要求使用。加入(),我已經實現了我學到如何從這裏殺死所有這些進程Python Multiprocessing Kill Processes。但我想知道我的代碼可能會出現什麼問題。 我不能在main1函數中共享我的所有代碼,但我已將整個代碼塊放在try catch塊中,以避免主代碼中的錯誤可能導致殭屍進程的情況。

def main1((param1, param2, param3)): 
    try: 
     resout.append(some_data) //resout in case of no error 
    except: 
     print traceback.format_exc() 
     resout = [] //sending empty resout in case of error 
    return resout 

我還是很新的並行編程和調試問題的概念,它是談到了將tricky.Any幫助將不勝感激。

+0

不幸的是,您發佈的代碼對診斷問題沒有多大幫助。太多無法解釋的變量,更重要的是,從你發佈的代碼被調用的方式以及函數返回後發生了什麼,並不清楚。我最初的印象是,你正在循環中創建許多池,而不是多次重複使用池。但我不能確定。 – justinpawela

+0

[你應該像這樣構建你的代碼。](http://pymotw.com/2/multiprocessing/communication.html#process-pools)如果你有很多工作要做,你應該反覆使用同一個池(你只能一次調用'Pool()')。當你最終完成工作進程時,調用'close'和'join'很重要 - 它們是終止進程的信號;他們不只是爲了墮落殭屍。在上面的第一個代碼塊中,如果'results'爲空,那麼您不會終止工作人員,只需將''返回給任何代碼就是調用者。 – justinpawela

回答

10

通常最常見的問題是池已創建但未關閉。

我知道,以保證池關閉時,最好的辦法是使用try/finally從句:

try: 
    pool = Pool(ncores) 
    pool.map(yourfunction, arguments) 
finally: 
    pool.close() 
    pool.join() 

如果你不想multiprocessing掙扎,我寫了一個名爲parmap一個簡單的包包裝多處理,使我的生活(和潛在你的)更容易。

pip install parmap

import parmap 
parmap.map(yourfunction, arguments) 

從parmap用法部分:

  • 簡單平行例如:

    import parmap 
    y1 = [myfunction(x, argument1, argument2) for x in mylist] 
    y2 = parmap.map(myfunction, mylist, argument1, argument2) 
    y1 == y2 
    
  • 遍歷元組的列表:

    # You want to do: 
    z = [myfunction(x, y, argument1, argument2) for (x,y) in mylist] 
    z = parmap.starmap(myfunction, mylist, argument1, argument2) 
    
    
    # You want to do: 
    listx = [1, 2, 3, 4, 5, 6] 
    listy = [2, 3, 4, 5, 6, 7] 
    param = 3.14 
    param2 = 42 
    listz = [] 
    for (x, y) in zip(listx, listy): 
        listz.append(myfunction(x, y, param1, param2)) 
    # In parallel: 
    listz = parmap.starmap(myfunction, zip(listx, listy), param1, param2) 
    
+0

對於不想處理與多處理相關的混亂的開發人員來說,這實際上非常方便。 – ankits