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()
Je me demande simplement pourquoi le code ci-dessus n'imprime pas vraiment "vous avez quitté". Qu'est-ce que je fais mal? si c'est le cas, quelqu'un peut-il m'indiquer la bonne façon de sortir avec élégance? (Je ne parle pas de process.terminate or kill)
La raison pour laquelle vous ne voyez pas cela se produire est que vous ne communiquez pas avec le sous-processus. Vous essayez d'utiliser une variable locale (locale au processus parent) pour signaler à l'enfant qu'elle doit s'arrêter.
Jetez un œil aux informations sur primitives de synchronisation . Vous devez configurer un signal quelconque qui peut être référencé dans les deux processus. Une fois que vous avez cela, vous devriez pouvoir appuyer sur l'interrupteur dans le processus parent et attendre que l'enfant meure.
Essayez le code suivant:
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 __== "__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()