Python子进程通信,顶部显示低CPU使用率

时间:2013-02-13 20:01:30

标签: python subprocess cpu popen

给出一个非常简单的脚本:

import subprocess

while True:
    x = subprocess.Popen('ls -ltr /usr/lib', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

我在笔记本电脑的Ubuntu 12.04(32位),赛扬2核上获得了以下“顶级”CPU使用率:

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%

为什么cpu使用率如此之低且如此不同?我在核心i5和原子ubuntus上尝试了这个,结果接近100%(3.2)和80%(2.7)。顶级没什么,我的平台出了什么问题?

1 个答案:

答案 0 :(得分:1)

至少有一些问题是你使用磁盘而不是CPU使用其中一些命令。 “ls -l / usr / lib”肯定会涉及磁盘访问(因为它在每个文件上运行stat()):我可以相信加载gcc涉及更少的磁盘访问,并且内置的pwd更少。

我也相信也许os.popen,subprocess.Popen和Python3版本在它们是否会产生一个新的shell,它具有什么属性(以及例如它是否必须从磁盘读取/ etc / profile)方面存在差异),等等。

正如评论已经说过的那样,计算密集型工作将使您的CPU使用率高于IO-bound工作,如“ls -l”。下面给我带来了100%的CPU:

while True:
    a = 11*11