web-dev-qa-db-fra.com

Python Multiprocessing Exit élégamment Comment?

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)

43
phroxy

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()
47
jkp