views:

407

answers:

1
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 doshit(self):
        print "haha", self.exit


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

Hey everyone, I am just wondering how come the code above doesn't really print "you exited". What am I doing wrong? if so, may someone point me out the correct way to exit gracefully? ( I am not referring to process.terminate or kill)

+1  A: 

The reason you are not seeing this happen is because you are not communicating with the subprocess. You are trying to use a local variable (local to the parent process) to signal to the child that it should shutdown.

Take a look at the information on synchonization primatives. You need to setup a signal of some sort that can be referenced in both processes. Once you have this you should be able to flick the switch in the parent process and wait for the child to die.

Try the following code:

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()
jkp
thx man, I was just looking up the API for VALUE, and i don't think it's mutable. This will work great in my app.Thx a lot
Instead of waiting 3 seconds after you call shutdown (what if it takes longer than 3s to shutdown), you can join the process to quit exactly when the process is done -> process.join()
scompt.com
I just followed his original example: I wouldn't wait at all! (I'd do what you suggested).
jkp