我一直在使用工作人員池實施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爲我的應用程序
現在,經過一個快照,我已經閱讀了很多關於計算器類似的問題,如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幫助將不勝感激。
不幸的是,您發佈的代碼對診斷問題沒有多大幫助。太多無法解釋的變量,更重要的是,從你發佈的代碼被調用的方式以及函數返回後發生了什麼,並不清楚。我最初的印象是,你正在循環中創建許多池,而不是多次重複使用池。但我不能確定。 – justinpawela
[你應該像這樣構建你的代碼。](http://pymotw.com/2/multiprocessing/communication.html#process-pools)如果你有很多工作要做,你應該反覆使用同一個池(你只能一次調用'Pool()')。當你最終完成工作進程時,調用'close'和'join'很重要 - 它們是終止進程的信號;他們不只是爲了墮落殭屍。在上面的第一個代碼塊中,如果'results'爲空,那麼您不會終止工作人員,只需將''返回給任何代碼就是調用者。 – justinpawela