Sto usando la funzionalità di multiprocessing di Python per mappare alcune funzioni attraverso alcuni elementi. Qualcosa sulla falsariga di questo:Perché i Lavoratori Multiprocessi Python non muoiono?
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
Generalmente corro test in ipython utilizzando sia CPython e PyPy. Ho notato che i processi generati spesso non vengono uccisi, quindi iniziano ad accumularsi, ognuno utilizzando un concerto di ram. Questo succede quando si preme ctrl-k durante un calcolo, che invia il multiprocessing in una grande frenesia di confusione. Ma anche quando finiscono i calcoli, quei processi non moriranno in Pypy.
In base alla documentazione, quando il pool viene raccolto dei rifiuti, deve chiamare terminate()
e terminare tutti i processi. Cosa sta succedendo qui? Devo chiamare esplicitamente lo close()
? In caso affermativo, esiste una sorta di gestore del contesto che gestisce correttamente la chiusura delle risorse (ad esempio i processi)?
Questo è su Mac OS X Yosemite.
upvote per un vero titolo capitalista – percusse
Forse hai semplicemente bisogno di aggiungere '' prova: ... finalmente: pool.terminate() ''? –
Forse la mia domanda non è chiara - sto dicendo che i lavoratori restano in campo anche quando il calcolo finisce. Anche se non dovrebbero, se capisco la documentazione correttamente, in ogni caso. – Ant6n