Python多处理优雅退出如何?

45 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()
Run Code Online (Sandbox Code Playgroud)

我只是想知道为什么上面的代码没有真正打印"你退出".我究竟做错了什么?如果是这样,有人可能会指出我正确退出的正确方法吗?(我不是指process.terminate或kill)

jkp*_*jkp 47

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

看一下有关同步化原理的信息.您需要设置某种可在两个进程中引用的信号.一旦你有了这个,你应该能够在父进程中轻拂开关并等待孩子死亡.

请尝试以下代码:

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()
Run Code Online (Sandbox Code Playgroud)

  • `shutdown()`不再是`process`的方法.现在正确的方法是`terminate()`.https://docs.python.org/2/library/multiprocessing.html (12认同)
  • 在调用shutdown之后等待3秒钟(如果关闭时间超过3秒),您可以加入进程以在进程完成时准确退出 - > process.join() (4认同)
  • 对于`def __init __(self,):`中的逗号是否有任何意义? (2认同)