【发布时间】:2013-05-02 14:45:14
【问题描述】:
我有一个在 Python / PyQt / QtWebKit 基础上运行的 JavaScript 应用程序,它创建 subprocess.Popen 对象来运行外部进程。
Popen 对象保存在字典中并由内部标识符引用,以便 JS 应用程序可以通过 pyqtSlot 调用 Popen 的方法,例如 poll() 以确定进程是否仍在运行或kill() 杀死流氓进程。
如果某个进程不再运行,我想从字典中删除其Popen 对象以进行垃圾回收。
自动清理字典以防止内存泄漏的推荐方法是什么?
到目前为止我的想法:
- 在每个衍生进程的线程中调用
Popen.wait()以在终止时立即执行自动清理。
专业版:立即清理,线程可能不会消耗太多 CPU 功率,因为它们应该处于休眠状态,对吗?
CON:许多线程取决于生成活动。 - 使用线程在所有现有进程上调用
Popen.poll(),并检查returncode是否已终止并在这种情况下进行清理。
专业版:所有进程只需一个工作线程, 降低内存使用率。
CON:需要定期轮询,如果有许多长时间运行的进程或产生大量已处理的进程,则 CPU 使用率会更高。
你会选择哪一个,为什么?还是有更好的解决方案?
【问题讨论】:
-
这需要在什么操作系统上运行?
-
主要是 Windows,如果可能的话,Mac OS X,Linux 会很高兴。最好是与平台无关的解决方案。
-
好吧,我给出的答案适用于 Linux 和 OSX。我得考虑一下 Windows 解决方案。
-
好的,谢谢,我忘了说这是 Python 3.3。
-
更新了答案。代码示例适用于 Python 2.x,但对于 3.x-compat,您只需将
print foo更改为print(foo)。
标签: python python-3.x pyqt subprocess qtwebkit