Sto lavorando su un renderfarm e ho bisogno che i miei client possano avviare più istanze di un renderer, senza bloccare in modo che il client possa ricevere nuovi comandi. Ho funzionato correttamente, tuttavia ho problemi a terminare i processi creati.python multiprocessing pool terminate
A livello globale, definisco la mia piscina (in modo che io possa accedere da qualsiasi funzione):
p = Pool(2)
Ho poi chiamo il mio renderer con apply_async:
for i in range(totalInstances):
p.apply_async(render, (allRenderArgs[i],args[2]), callback=renderFinished)
p.close()
quella funzione finiture , avvia i processi in background e attende nuovi comandi. Ho fatto un semplice comando che ucciderà il cliente e fermare la rende:
def close():
'close this client instance'
tn.write ("say "+USER+" is leaving the farm\r\n")
try:
p.terminate()
except Exception,e:
print str(e)
sys.exit()
sys.exit()
Non sembra dare un errore (che sarebbe stampare l'errore), le termina Python, ma i processi in background sono ancora in esecuzione. Qualcuno può raccomandare un modo migliore per controllare questi programmi lanciati?
Provare ad abilitare la registrazione di debug con 'dal programma di importazione multiprocessing; util.get_logger(). setLevel (util.DEBUG) 'e incolla l'output. – schlamar
Ho visto un comportamento come questo ma non riesco a riprodurlo ora ... Mi chiedo se chiamare p.join() possa essere d'aiuto dopo aver chiamato p.terminate()? Mi chiedo anche se è addirittura necessario chiamare terminare e se solo facendo sys.exit() sarà possibile raccogliere correttamente il Pool e tutti i suoi processi. – mdscruggs
quando provo ad abilitare il logging, sto ricevendo questo nella console: "Nessun gestore può essere trovato per il multiprocessing del logger" .Purtroppo, p.join() dopo p.terminate() non fa differenza, e sys .exit() chiude il python ma lascia i processi in esecuzione in background. – tk421storm