2009-08-05 12 views
36
import multiprocessing 
import time 

class testM(multiprocessing.Process): 

    def __init__(self): 
     multiprocessing.Process.__init__(self) 
     self.exit = False 

    def run(self): 
     while not self.exit: 
      pass 
     print "You exited!" 
     return 

    def shutdown(self): 
     self.exit = True 
     print "SHUTDOWN initiated" 

    def dostuff(self): 
     print "haha", self.exit 


a = testM() 
a.start() 
time.sleep(3) 
a.shutdown() 
time.sleep(3) 
print a.is_alive() 
a.dostuff() 
exit() 

Zastanawiam się, jak to możliwe, że powyższy kod naprawdę nie drukuje "wyszedłeś". Co ja robię źle? jeśli tak, to czy ktoś może wskazać mi właściwy sposób na wyjście z wdziękiem? (Nie mam na myśli procesu process.terminate ani kill)Wieloprocesorowe przetwarzanie w Pythonie kończy się elegancko Jak?

+0

Faktycznie, cały ten kod powinien dać Ci jak jest to NameError, ponieważ starasz się instancję klasy podczas tworzenia klasy. Innymi słowy: Prawdopodobnie chcesz wydać ostatnie osiem linii. – balpha

+1

Uwaga: ten przykładowy kod zakończy się niepowodzeniem na win32, ponieważ nie zabezpieczono głównego kodu skryptu klauzulą ​​strażnika: 'jeśli __name__ ==" __main__ ": ... – jkp

Odpowiedz

39

Powodem, dla którego nie widzisz tego, jest to, że nie komunikujesz się z podprocesorem. Próbujesz użyć zmiennej lokalnej (lokalnej do procesu nadrzędnego), aby zasygnalizować dziecku, że powinna ona zostać zamknięta.

Proszę spojrzeć na informacje na temat synchonization primatives. Musisz ustawić jakiś sygnał, który można przywołać w obu procesach. Gdy już to zrobisz, powinieneś być w stanie przesunąć przełącznik w procesie nadrzędnym i poczekać, aż dziecko umrze.

Wypróbuj poniższy kod:

import multiprocessing 
import time 

class MyProcess(multiprocessing.Process): 

    def __init__(self,): 
     multiprocessing.Process.__init__(self) 
     self.exit = multiprocessing.Event() 

    def run(self): 
     while not self.exit.is_set(): 
      pass 
     print "You exited!" 

    def shutdown(self): 
     print "Shutdown initiated" 
     self.exit.set() 


if __name__ == "__main__": 
    process = MyProcess() 
    process.start() 
    print "Waiting for a while" 
    time.sleep(3) 
    process.shutdown() 
    time.sleep(3) 
    print "Child process state: %d" % process.is_alive() 
+0

thx człowiek, właśnie szukałem API dla VALUE, i nie sądzę, że jest zmienna. To zadziała dobrze w mojej aplikacji. Thx lot –

+3

Zamiast czekać 3 sekundy po wywołaniu shutdown (co, jeśli trwa dłużej niż 3s, aby zamknąć), możesz dołączyć do procesu, aby zakończyć dokładnie po zakończeniu procesu -> process.join() –

+0

Po prostu poszedłem jego oryginalny przykład: w ogóle bym nie czekał! (Zrobiłbym to, co sugerowałeś). – jkp

Powiązane problemy