Основные настройки:
Я использую python script для автоматического тестирования проекта программирования, над которым я работаю. В тесте я запускаю свой исполняемый файл с множеством различных опций и сравниваю результат с предыдущими запусками. Тестирование занимает довольно много времени, так как у меня есть примерно 600 тыс. Различных тестов для запуска.
В настоящий момент я разделил свой script на две части - тестовый модуль, который захватывает тесты из очереди заданий и помещает результаты в очередь результатов и основной модуль, который создает очередь заданий а затем проверяет результаты. Это позволяет мне работать с несколькими тестовыми процессами/потоками, которые до сих пор не улучшали скорость тестирования (я запускаю это на двухъядерном компьютере, я ожидал бы, что больше тестовых процессов будет работать лучше на квадранте -core).
В тестовом модуле я создаю командную строку, которую затем выполняю с помощью
subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
Затем я прочитал результаты из трубы и поместил ее в очередь результатов.
Вопрос:
Является ли это наиболее эффективным способом запуска большого количества командных строк в многоядерной системе? Каждый Popen, который я создаю, создает новый процесс, который, похоже, может создать довольно много накладных расходов, но я не могу думать о более эффективном способе этого делать. (В настоящее время я использую python 2.7, если это имеет значение.)
EDIT:
ОС - Linux
Подпроцессы, которые я запускаю, являются C-исполняемыми файлами командной строки с аргументами.
В конце концов я создал C-привязки python (с SWIG) непосредственно к коду, который я хотел протестировать. Это оказалось в несколько сотен раз быстрее, чем запуск подпроцессов.
Вы можете взглянуть на модуль mulitprocessing, особенно часть пула.
Это позволит вам запускать как процессы, как вы хотите (по умолчанию столько же, сколько ядра процессора).
Сначала попробуйте измерить схему тестирования script/с нулевым исполняемым файлом. Таким образом, вы можете увидеть, сколько накладных расходов у процесса нерест w.r.t. фактическое время тестирования. Затем мы имеем некоторые реальные данные, чтобы действовать.
Добавление пакетного режима к вашему exe (который читает командные строки из файла и делает это работает), вероятно, является хорошей идеей, если объем работы мал по сравнению с временем, требуемым для загрузки и закрытия вашего процесса. Кроме того, это поможет вам найти утечки памяти.:)
Перемещая материал из main(), это не так сложно сделать.