【发布时间】:2014-06-18 11:53:49
【问题描述】:
我正在编写一个 GUI 应用程序,该应用程序有一个调用长任务的按钮。为了不冻结 GUI,我使用 python 3.3 的多处理模块将任务委托给不同的进程。然后我使用管道返回结果进行显示。
我希望应用程序即使在计算过程中退出也不会留下任何僵尸进程。由于我在 Mac 上,这可以通过以下两种方式之一发生:退出应用程序 (Command+Q) 或关闭它的窗口。
这是链接到 GUI 中按钮的函数中的代码:
main_pipe,child_pipe=Pipe()
p=Process(target=worker,args=(child_pipe,data))
p.start()
try:
while not main_pipe.poll():
root.update()
value_array=main_pipe.recv()
finally:
p.join()
这不起作用,应用程序不响应 Command+q,并且关闭窗口会留下两个僵尸进程运行(一个用于 GUI,一个用于工作人员)。
如何使它在其他情况下也能正常工作? 这是好习惯吗?是一种更好、更 Python 的方式吗?
另外,在脚本的最后,我有这两行(如果窗口在不处理任何内容的情况下关闭,exit() 将关闭应用程序):
root.mainloop()
exit()
最后,update() 和 mainloop() 有什么区别?只是后者占用了程序,而 update() 没有?
【问题讨论】:
-
您是否尝试过添加一个例外:在出现异常时手动停止进程的操作?
-
我刚试过,效果一样。 (我假设说停止您的意思是 p.join())
-
尝试使用 os.kill(processid,sig) 方法
-
关闭窗口时有效,但Command+Q无效
标签: python user-interface python-3.x tkinter multiprocessing