【问题标题】:Python Multiprocessing Exit Elegantly How?Python 多处理如何优雅地退出?
【发布时间】:2009-08-05 07:07: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)

【问题讨论】:

  • 实际上,所有这些代码都应该按原样给您一个 NameError,因为您正在尝试在类创建期间实例化该类。换句话说:您可能想要减少最后八行。
  • 注意:此示例代码将在 win32 上失败,因为您没有使用保护子句保护主脚本代码:`if name == "main": ...

标签: python multiprocessing


【解决方案1】:

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

查看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 __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()

【讨论】:

  • thx 伙计,我只是在查找 VALUE 的 API,我不认为它是可变的。这在我的应用程序中非常有用。非常感谢
  • 在调用shutdown后等待3秒(如果关闭时间超过3s怎么办),您可以加入进程以在进程完成后准确退出 -> process.join()
  • 我只是按照他原来的例子:我不会等的! (我会按照你的建议做)。
  • shutdown() 不再是process 的方法。现在正确的方法是terminate()docs.python.org/2/library/multiprocessing.html
  • def __init__(self, ):中的逗号有什么意义吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 2019-01-15
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 2011-11-26
相关资源
最近更新 更多