首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流程所有权以及如何管理流程的顺序

流程所有权以及如何管理流程的顺序
EN

Stack Overflow用户
提问于 2018-01-27 01:57:48
回答 1查看 81关注 0票数 0

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

不过,我现在运行的是UI;先在TKinter上试用,然后在PyQt5上运行。在这种情况下,我遇到了一些问题,我的测试进程没有像在终端中那样关闭,而是像僵尸一样挂起。虽然我认为僵尸进程不是太大的问题,但我担心的是,就进程所有权而言,我无法控制或理解“谁在掌管这条船”。

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

EN

回答 1

Stack Overflow用户

发布于 2018-01-28 00:48:14

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

剩下的是僵尸进程,因为当您终止python进程时,并不一定要终止C进程。

事情是这样的,在PyQt中,当一个Qt对象被删除时,它会删除所有与它相关的其他Qt对象(孩子,子孩子,等等),但是如果有一个对象没有父对象或者因为某种原因无法访问,它将成为一个僵尸进程,你将无法杀死它,除非你重启你的计算机或者你找到并杀死Qt循环。

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

在一个简单的应用程序中,你只需要如下所示:

代码语言:javascript
复制
app = QApplication(sys.argv)
main = MainObject()
main.show()
sys.exit(app.exec_())

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

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

代码语言:javascript
复制
object.deleteLater()

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48466964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档