如何在python中有效地运行大量子进程?

时间:2011-05-18 14:18:58

标签: python multithreading performance multicore

基本设置:
我正在使用python脚本自动测试我正在进行的编程项目。在测试中,我使用许多不同的选项运行我的可执行文件,并将结果与​​之前的运行进行比较。由于我有大约600k不同的测试要运行,测试需要花费很多时间。

目前,我已将脚本拆分为两部分,一个测试模块,它从作业队列中获取测试并将结果放入结果队列,以及一个创建作业队列的主模块,然后检查结果。这让我可以使用几个测试过程/线程,到目前为止还没有在测试速度上有任何改进(我在双核计算机上运行它,我希望更多的测试过程在四核上更好地工作-core)。

在测试模块中,我创建一个命令字符串,然后使用

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

然后我从管道中读取结果并将其放在结果队列中。

问题:

这是在多核系统上运行大量命令字符串的最有效方法吗?我每个Popen都会创建一个新进程,这似乎可能会产生相当多的开销,但我无法想到更好的方法来实现它。
(我现在正在使用python 2.7,以防万一。)

编辑:
操作系统是Linux 我产生的子进程是带参数的命令行C可执行文件。

3 个答案:

答案 0 :(得分:3)

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

它允许您根据需要启动进程(默认为CPU内核)。

答案 1 :(得分:1)

首先,尝试使用null-executable来测量测试脚本/方案。这样你就可以看到进程产生了多少开销w.r.t.实际测试时间。然后我们有一些真实的数据可以采取行动。

如果工作量与加载和关闭进程所需的时间相比较小,那么将批处理模式添加到exe(从文件读取命令行并执行此操作)可能是个好主意。此外,它还可以帮助您发现内存泄漏。 :)

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

答案 2 :(得分:1)

最后我将python C-bindings(带SWIG)直接创建到我想测试的代码中。事实证明它比启动子进程快几百倍。