处理所有权以及如何管理其订单



我在OSX上运行Python3;到目前为止我一直在使用终端启动的控制台应用程序),据我了解,终端正在生成进程,它们是生成者的子进程,所以当它消失时,所有子进程都会终止。

虽然,现在我正在运行UI;尝试使用TKinter,然后在PyQt5上移动。在这种情况下,我遇到了一些问题,我的测试过程没有像在终端中发生的那样关闭,而是像僵尸一样挂起。虽然我相信僵尸进程不是什么大问题,但我担心的是,就进程所有权而言,我无法控制或理解"谁在运行船只"。

有没有办法得到一种树,关于哪个进程在另一个进程(或多个进程)上持有;这样我就可以处理订单并关闭正确的订单?同样出于某种原因,即使对僵尸过程进行sudo kill -9也不会杀死它;所以我真的很想知道后端发生了什么并正确处理事情。

PyQt是实际Qt C代码的Python绑定,当你启动PyQt应用程序时,你正在启动Python进程和C Qt循环进程。

你还剩下僵尸进程,因为当你终止你的python进程时,你不一定会终止C进程。

事情是这样的,在 PyQt 中,当删除 Qt 对象时,它会删除与之相关的所有其他 Qt Ojbect(子对象、子对象等),但如果有一个没有父对象或以某种方式无法访问,它将成为僵尸进程,除非您重置计算机或找到并杀死 Qt 循环,否则您将无法杀死它。

因此,为了使您的生活更轻松,您应该将代码设置为具有 1 个主对象,并且所有其他对象都应与之相关,因此当您终止应用程序时,您需要做的就是删除一个对象,所有其他对象都将被正确删除。

在一个简单的应用程序中,您只会有这样的东西:

app = QApplication(sys.argv)
main = MainObject()
main.show()
sys.exit(app.exec_())

退出由sys.exit(app.exec_())处理,所有应用对象都继承自 main。

但是如果你想在执行过程中删除一个Qt对象,你不能像在python中那样删除它。您必须让Qt通过将其设置为删除来处理删除:

object.deleteLater()

您可以在ekhumoro的这个答案中得到更好的解释

最新更新