Подпроцесс Python взаимодействует, верхняя часть показывает низкое использование процессора
Учитывая очень простой скрипт, как:
import subprocess
while True:
x = subprocess.Popen('ls -ltr /usr/lib', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
Я получаю следующее "топовое" использование процессора на своем ноутбуке Ubuntu 12.04 (32bit), Celeron 2-core:
x = subprocess.Popen('ls -l /usr/lib', ...
python3.2.3: 6%, python2.7.3: 5% (ls 0%)
x = subprocess.Popen('gcc --version', ...
python3.2.3: 22%, python2.7.3: 18% (gcc 0%)
x = subprocess.Popen('pwd', ...
python3.2.3: 47%, python 2.7.3: 35% (pwd 0%)
Если subprocess.Popen заменяется на os.popen, результаты будут другими:
x = os.popen('ls /usr/lib').read()
python3.2.3: 8%, python2.7.3: 3% (gcc 0%)
x = os.popen('gcc --version').read()
python3.2.3: 45%, python 2.7.3: 9%
x = os.popen('pwd').read()
python3.2.3: 68%, python 2.7.3: 22%
Почему использование процессора такое низкое и такое разное? Я попробовал это на ядре i5 и Atom Ubuntus, и результаты были близки к 100% (3,2) и 80%(2,7). Ничего другого в топе, что не так с моей платформой?
1 ответ
По крайней мере, часть проблемы будет в том, что вы используете диск, а не процессор с некоторыми из этих команд. "ls -l /usr/lib" определенно будет включать доступ к диску (так как он запускает stat() для каждого файла): я могу поверить, что загрузка gcc требует меньше доступа к диску, а встроенная оболочка pwd - еще меньше.
Я также мог бы полагать, что, возможно, версии os.popen, subprocess.Popen и Python3 имеют различия в том, создают ли они новую оболочку, какие атрибуты у этой оболочки (и, например, например, должна ли она читать /etc/profile с диска), и скоро.
Как уже отмечалось в комментариях, интенсивная работа с вычислительными ресурсами даст вам более высокую загрузку ЦП, чем работа, связанная с IO, например, "ls -l". Следующее доводит меня до 100% CPU довольно приятно:
while True:
a = 11*11