2011-05-18 76 views
1

基本设置:
我正在使用python脚本来自动测试我正在编写的编程项目。在测试中,我运行带有许多不同选项的可执行文件,并将结果与​​以前的运行进行比较。由于我有大约600k个不同的测试运行,所以测试需要很长时间。如何在Python中高效地运行大量的子进程?

目前,我已将脚本分成两部分,一个测试模块,用于从作业队列获取测试结果并将结果放入结果队列,另一个主要模块创建作业队列,以及然后检查结果。这使我可以使用几种测试过程/线程,这些测试过程/线程迄今为止在测试速度方面没有提供任何改进(我正在双核计算机上运行该测试过程,因此我希望更多的测试过程能够更好地在四核-核心)。

在测试模块,创建一个命令串,我然后执行使用

subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) 

然后我读从管的结果,并将其放置在结果队列。

问:

这是一个多核系统上运行很多很多的命令字符串的最有效的方法是什么?我所做的每一个Popen都会创建一个新的流程,这似乎可能会造成相当多的开销,但我真的无法想到一个更好的方法来实现它。
(我目前使用Python 2.7的情况下,此问题。)

编辑:
在Linux操作系统上
我产卵子过程是命令行C-可执行文件与参数。

+0

是其他python程序的命令吗?命令行程序?混合包? – Andrew 2011-05-18 14:23:03

+0

这是什么操作系统? – Macke 2011-05-18 14:24:37

回答

1

最后,我直接创建了Python C绑定(带有SWIG)到我想测试的代码。事实证明,它比启动子进程快几百倍。

+0

+1。完全避免启动进程当然更快。这取决于您对环境的控制程度。 – Macke 2013-10-24 08:20:36

1

首先,尝试使用空可执行文件测量测试脚本/方案。通过这种方式,您可以看到产生的进程有多少开销w.r.t.实际测试时间。然后我们有一些真实的数据可以采取行动。

如果与加载和关闭进程所花费的时间相比,工作量很小,向您的exe文件添加批处理模式(即从文件读取命令行并执行该操作)可能是一个好主意。另外,它会帮助你找到内存泄漏。 :)

通过将东西移出main(),这不是很难做到。

+0

如何在Python中创建内存泄漏? – tMC 2011-05-18 14:55:29

+0

@tMC:一个使用泄漏的本地库,或者引用的时间比预期的要长,或者定义禁用CPython的循环垃圾收集器的__del__。中间问题可能相当普遍,特别是如果您的程序是面食般的。 ;) – Macke 2011-05-18 15:02:13

+0

好主意。运行带有“hello world”的脚本 - 可执行文件几乎与执行测试的时间相同。但是,当我删除子进程调用时,脚本在2分钟内完成,所以它绝对是杀死性能的子处理。 – Leo 2011-05-18 20:58:56

3

您可以看看mulitprocessing module,尤其是Pool part

它将允许您按照需要启动进程(默认与CPU核心一样多)。

+1

不幸的是已经尝试过了,没有任何性能提升。工作者池的功能是为什么我首先将我的测试脚本从AWK转换为python。 – Leo 2011-05-18 14:45:41

+1

如果进程池没有任何性能增益,也许是因为你的算法,如果这些工作必须以串行方式完成,无论你如何进行并行操作,它都不会获得任何收益。 – 2011-05-18 14:53:46

+1

这些工作是完全独立的,可以并行完成,问题是每个工作都需要启动一个子进程,这可能是杀死性能的原因。 – Leo 2011-05-18 20:53:10

相关问题