Używam funkcji przetwarzania wieloprocesorowego Pythona do odwzorowania niektórych funkcji na niektóre elementy. Coś w tym stylu:Dlaczego pracownicy wieloprocesorowi Pythona nie umierają?
def computeStuff(arguments, globalData, concurrent=True):
pool = multiprocessing.Pool(initializer=initWorker, initargs=(globalData,))
results = pool.map(workerFunction, list(enumerate(arguments)))
return results
def initWorker(globalData):
workerFunction.globalData = globalData
def workerFunction((index, argument)):
... # computation here
Generalnie uruchamiam testy w ipythonie używając zarówno cPython, jak i Pypy. Zauważyłem, że procesy odradzania często nie są zabijane, więc zaczynają się akumulować, a każdy z nich wykorzystuje gigabajt pamięci RAM. Dzieje się to po naciśnięciu klawisza ctrl-k podczas obliczeń, co powoduje, że przetwarzanie wieloprocesowe staje się wielkim szaleństwem. Ale nawet po zakończeniu obliczeń procesy te nie umrą w Pypy.
Zgodnie z dokumentacją, gdy basen zostanie zebrany śmieci, powinien zadzwonić pod numer terminate()
i zabić wszystkie procesy. Co tu się dzieje? Czy muszę jawnie dzwonić pod numer close()
? Jeśli tak, czy istnieje jakiś menedżer kontekstów, który właściwie zarządza zamykaniem zasobów (to znaczy procesów)?
Jest to na Mac OS X Yosemite.
Awans na prawdziwy tytuł kapitalisty – percusse
Może po prostu trzeba dodać '' try: ... finally: pool.terminate() ''? –
Może moje pytanie nie jest jasne - mówię, że robotnicy kręcą się nawet po zakończeniu obliczeń. Chociaż nie powinni, jeśli dobrze rozumiem dokumentację, w każdym przypadku. – Ant6n