Как эффективно запустить много подпроцессов в Python?

1

Основные настройки:
Я использую python script для автоматического тестирования проекта программирования, над которым я работаю. В тесте я запускаю свой исполняемый файл с множеством различных опций и сравниваю результат с предыдущими запусками. Тестирование занимает довольно много времени, так как у меня есть примерно 600 тыс. Различных тестов для запуска.

В настоящий момент я разделил свой script на две части - тестовый модуль, который захватывает тесты из очереди заданий и помещает результаты в очередь результатов и основной модуль, который создает очередь заданий а затем проверяет результаты. Это позволяет мне работать с несколькими тестовыми процессами/потоками, которые до сих пор не улучшали скорость тестирования (я запускаю это на двухъядерном компьютере, я ожидал бы, что больше тестовых процессов будет работать лучше на квадранте -core).

В тестовом модуле я создаю командную строку, которую затем выполняю с помощью

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

Затем я прочитал результаты из трубы и поместил ее в очередь результатов.

Вопрос:

Является ли это наиболее эффективным способом запуска большого количества командных строк в многоядерной системе? Каждый Popen, который я создаю, создает новый процесс, который, похоже, может создать довольно много накладных расходов, но я не могу думать о более эффективном способе этого делать. (В настоящее время я использую python 2.7, если это имеет значение.)

EDIT:
ОС - Linux
Подпроцессы, которые я запускаю, являются C-исполняемыми файлами командной строки с аргументами.

  • 0
    Команды других программ Python? программы командной строки? Смешанная сумка?
  • 0
    Что это за ОС?
Теги:
performance
multithreading
multicore

3 ответа

1
Лучший ответ

В конце концов я создал C-привязки python (с SWIG) непосредственно к коду, который я хотел протестировать. Это оказалось в несколько сотен раз быстрее, чем запуск подпроцессов.

  • 0
    +1. Избегать пусковых процессов, конечно же, быстрее. Это зависит от того, насколько вы контролируете свое окружение.
3

Вы можете взглянуть на модуль mulitprocessing, особенно часть пула.

Это позволит вам запускать как процессы, как вы хотите (по умолчанию столько же, сколько ядра процессора).

  • 1
    Уже пробовал без какого-либо увеличения производительности, к сожалению. Именно из-за функциональности рабочего пула я конвертировал свой тестовый скрипт из AWK в python.
  • 1
    Если у вас нет никакого выигрыша в производительности с пулом процессов, возможно, это из-за вашего алгоритма, если задания должны выполняться сериализованным способом, независимо от того, как вы выполняете параллелизм, он ничего не получит.
Показать ещё 1 комментарий
1

Сначала попробуйте измерить схему тестирования script/с нулевым исполняемым файлом. Таким образом, вы можете увидеть, сколько накладных расходов у процесса нерест w.r.t. фактическое время тестирования. Затем мы имеем некоторые реальные данные, чтобы действовать.

Добавление пакетного режима к вашему exe (который читает командные строки из файла и делает это работает), вероятно, является хорошей идеей, если объем работы мал по сравнению с временем, требуемым для загрузки и закрытия вашего процесса. Кроме того, это поможет вам найти утечки памяти.:)

Перемещая материал из main(), это не так сложно сделать.

  • 0
    Как создать утечки памяти в Python?
  • 0
    @tMC: Каждый использует нативные библиотеки, которые просачиваются, или хранит ссылки дольше, чем предполагалось, или определяет del , которая отключает циклический сборщик мусора CPython. Средняя проблема может быть довольно распространенной, особенно если ваша программа похожа на макароны. ;)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню