Я использовал subprocess.check_output()
в течение некоторого времени для захвата вывода из подпроцессов, но при определенных обстоятельствах столкнулся с некоторыми проблемами производительности. Я запускаю это на машине RHEL6.
Вызывающая среда Python скомпилирована в Linux и 64-битная. Подпроцессом, который я выполняю, является оболочка script, которая в конечном итоге запускает процесс python.exe Windows через Wine (почему эта глупость требуется, это еще одна история). В качестве вклада в оболочку script, я пишу небольшую часть кода Python, который передается в файл python.exe.
В то время как система находится под умеренной/большой нагрузкой (от 40 до 70% загрузки процессора), я заметил, что использование subprocess.check_output(cmd, shell=True)
может привести к значительной задержке (до ~ 45 секунд) после завершения выполнения подпроцесса возвращается команда check_output. Глядя на вывод из ps -efH
в течение этого времени, вызывается вызываемый подпроцесс как sh <defunct>
, пока он не вернется с нормальным нулевым статусом выхода.
И наоборот, использование subprocess.call(cmd, shell=True)
для запуска той же команды при той же средней/тяжелой нагрузке приведет к немедленному возврату подпроцесса без задержки, все выходные данные будут напечатаны в STDOUT/STDERR (а не возвращены из вызова функции).
Почему существует такая значительная задержка только тогда, когда check_output()
перенаправляет вывод STDOUT/STDERR в его возвращаемое значение, а не когда call()
просто возвращает его обратно родительскому STDOUT/STDERR?