Подпроцесс 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
Другие вопросы по тегам