Я пытаюсь использовать подпроцессный и многопроцессорный модуль python для запуска модульных тестов php для покрытия.Выполнение автономного покрытия PHP для всей кодовой базы занимает много времени, поэтому я пытаюсь распараллелить его, запустив покрытие для разных наборов тестов и затем объединив результат.Для этого я использую Python Subprocess и Multiprocessing module, проблема, с которой я сталкиваюсь, заключается в том, что некоторые тестовые наборы работают правильно, но некоторые ошибаются.
Я получаю следующую ошибку Запуск PHP: ошибка apc_mmap, с кодом ошибки -9, -11 для некоторых процессов.Также для некоторых наборов тестов, в которых много тестовых примеров, например около 15 КБ, весь вывод прогона phpunit не поступает.
Я запускаю 6 подпроцессов одновременно, так как это доступно для cpu_coreв моей ВМ.
Я инициализирую подпроцессы, используя следующую команду
Popen(cmd, shell=True, close_fds=True, stdout=file1, stderr=subprocess.PIPE)
И я использую pr.poll()
, чтобы проверить, завершен ли процесс,
Я пытался изменить размер буфера до 1 при инициализации объекта Popen, но все еще не получил весь вывод класса 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()