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