2009-08-05 17 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() 

Me pregunto cómo es que el código anterior realmente no imprime "saliste". ¿Qué estoy haciendo mal? Si es así, ¿alguien podría indicarme la forma correcta de salir con gracia? (No me refiero a process.terminate o kill)Python Multiprocesamiento Salir Elegantemente ¿Cómo?

+0

En realidad, todo este código debe darle tal cual es una NameError, porque estás tratando de crear una instancia de la clase durante la creación de la clase. En otras palabras: probablemente quieras dedentificar las últimas ocho líneas. – balpha

+1

Nota: este código de ejemplo fallará en win32 porque no ha protegido el código del script principal con una cláusula de guardia: 'if __name__ ==" __main__ ": ... – jkp

Respuesta

39

La razón por la que no está viendo esto suceder es porque no se está comunicando con el subproceso. Está intentando usar una variable local (local para el proceso principal) para indicarle al niño que se debe apagar.

Eche un vistazo a la información en synchonization primatives. Necesita configurar una señal de algún tipo que se pueda referenciar en ambos procesos. Una vez que tenga esto, debería poder presionar el interruptor en el proceso principal y esperar a que el niño muera.

Prueba el siguiente código:

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 man, solo estaba buscando la API para VALOR, y no creo que sea mutable Esto funcionará muy bien en mi aplicación. Thx mucho –

+3

En lugar de esperar 3 segundos después de apagar la llamada (¿qué pasa si tarda más de 3s en apagarse?), Puede unirse al proceso para salir exactamente cuando finalice el proceso -> process.join() –

+0

Acabo de seguir su ejemplo original: ¡no esperaría en absoluto! (Haría lo que sugeriste). – jkp

Cuestiones relacionadas