Python 多进程优雅退出怎么做?

50 投票
1 回答
67212 浏览
提问于 2025-04-15 13:23
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)

1 个回答

58

你之所以看不到这个情况发生,是因为你没有和子进程进行沟通。你试图用一个只在父进程中存在的局部变量来告诉子进程它应该关闭。

看看关于进程间同步的信息。你需要设置一种信号,这个信号在两个进程中都能被引用。一旦你有了这个信号,你就可以在父进程中切换开关,然后等待子进程结束。

试试下面的代码:

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

撰写回答