我正在尝试使用python子进程和mulitprocessing模块来运行php单元测试用例以进行覆盖。在整个代码库中独立运行PHP Coverage会花费很多时间,因此我试图通过为不同的测试套件运行Coverage然后合并结果来使其并行化。为此,我正在使用Python Subprocess和Multiprocessing模块,我面临的问题是某些测试套件运行正常,但有些却逐渐消失。
我遇到以下错误PHP启动:apc_mmap失败,某些进程的错误代码为-9,-11。另外,对于一些具有很多测试用例(例如15K左右)的测试套件,phpunit运行的全部输出都不会输入。
我一次运行6个子进程,这就是我的VM中可用的cpu_core。
我正在使用以下命令初始化子进程
Popen(cmd, shell=True, close_fds=True, stdout=file1, stderr=subprocess.PIPE)
我正在使用pr.poll()
检查该过程是否完成。
我在初始化Popen对象时尝试将bufsize更改为1,但仍然无法获得Popen类的全部输出。
有人可以建议我可能做错了什么吗?
这是示例代码-
import multiprocessing as mp
import subprocess
def createProcesses(testSuites):
procs = []
maxProcs = mp.cpu_count()
logfile = open("./testFile.txt", "w+")
for suites in testSuites:
while len(procs) != maxProcs:
manageProcs(procs)
procs.append(createWorkerTestProcesses)
while len(procs):
manageProcs(procs, logfile)
logfile.close()
def createWorkerTestProcesses(suite):
f= open(suite+"txt", "w+")
cmd = "php -d auto_prepend_file=/usr/local/www/data/tests/app_includes/auto_prepend_for_tests.php /usr/local/www/data/tests/sdk/bin/phpunit.phar --configuration phpunit.xml --testsuites " + suite
p = subprocess.Popen(cmd, shell=True, close_fds=True, stdout=f, stderr=subprocess.PIPE)
return p, f, suite
def manageProcs(proclist, logfile):
for p, f, suite in proclist:
if p.poll is not None:
f.seek(0)
logfile.write(f.read())
f.close()
proclist.remove((p,f,suite))
sleep(0.5)
def main():
createProcesses(testSuites)
main()