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

上記のコードが実際に「終了しました」と表示されないのはなぜだろうと思っています。私は何を間違っていますか?もしそうなら、誰かが優雅に終了する正しい方法を教えてもらえますか? (私は process.terminate または kill について言及していません)

4

1 に答える 1

56

これが発生しないのは、サブプロセスと通信していないためです。ローカル変数(親プロセスに対してローカル)を使用して、シャットダウンする必要があることを子に通知しようとしています。

同期プリミティブに関する情報を見てください。両方のプロセスで参照できるある種のシグナルを設定する必要があります。これを取得したら、親プロセスでスイッチをフリックして、子が死ぬのを待つことができるはずです。

次のコードを試してください。

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()
于 2009-08-05T07:23:47.117 に答える