web-dev-qa-db-ja.com

Python Multiprocessing Exit Elegantly How?

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を参照していません)

43
phroxy

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

synchonization primatives の情報をご覧ください。両方のプロセスで参照できる何らかの信号をセットアップする必要があります。これができたら、親プロセスのスイッチをフリックして、子が死ぬのを待つことができるはずです。

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

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