Python 多处理如何优雅地退出?

2022-01-12 00:00:00 python multiprocessing

问题描述

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)

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)


解决方案

您没有看到这种情况发生的原因是因为您没有与子进程通信.您正在尝试使用局部变量(父进程的本地变量)向子进程发出它应该关闭的信号.

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.

试试下面的代码:

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

相关文章