Pracuję nad renderfarm, i potrzebuję moich klientów, aby móc uruchomić wiele wystąpień renderer, bez blokowania, aby klient mógł otrzymywać nowe polecenia. Działa to poprawnie, ale mam problemy z zakończeniem tworzonych procesów.Pula wieloprocesorowa Pythona kończy
Na poziomie globalnym, określam moją basen (tak, że mogę do niego dostęp z dowolnej funkcji):
p = Pool(2)
I wtedy zadzwonić do mojego renderujący z apply_async:
for i in range(totalInstances):
p.apply_async(render, (allRenderArgs[i],args[2]), callback=renderFinished)
p.close()
tej funkcji wykończeń , uruchamia procesy w tle i czeka na nowe polecenia. Zrobiłem proste polecenia, które będą zabijać klienta i zatrzymać renderuje:
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()
Nie wydaje się, aby dać błąd (to wydrukować błąd), kończy python ale procesy tła są nadal bieganie. Czy ktoś może polecić lepszy sposób kontrolowania uruchomionych programów?
Spróbuj włączyć rejestrowanie debugowania za pomocą 'from multiprocessing import util; util.get_logger(). setLevel (util.DEBUG) 'i wklej dane wyjściowe. – schlamar
Widziałem takie zachowanie wcześniej, ale nie mogę odtworzyć go teraz ... Zastanawiam się, czy wywołanie p.join() pomogłoby po wywołaniu p.terminate()? Zastanawiam się również, czy musisz wywołać funkcję zakończ i jeśli po prostu wykonanie sys.exit() odpowiednio wyrzuci pulę i wszystkie jej procesy. – mdscruggs
Kiedy próbuję włączyć rejestrowanie, otrzymuję to w konsoli: "Nie można znaleźć żadnych programów obsługi dla rejestratora" w trybie wieloprocesowym ". Niestety, p.join() po p.terminate() nie robi różnicy, a sys .exit() zamyka pythona, ale pozostawia procesy działające w tle: – tk421storm