Python subprocess 通信,top 显示 CPU 使用率低

1 投票
1 回答
2002 浏览
提问于 2025-04-17 15:48

给定一个非常简单的脚本,比如:

import subprocess

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

我在我的笔记本电脑上使用Ubuntu 12.04(32位)时,看到的“顶级”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使用率这么低,而且差别这么大?我在core i5和atom的Ubuntu上试过,结果接近100%(3.2)和80%(2.7)。在top命令中没有其他进程,难道我的平台有什么问题吗?

1 个回答

1

问题的部分原因可能是你在使用某些命令时,主要依赖的是硬盘而不是CPU。比如,"ls -l /usr/lib"这个命令肯定会访问硬盘,因为它需要检查每个文件的状态。相比之下,加载gcc可能会涉及更少的硬盘访问,而shell内置的pwd命令则更少。

我也相信,os.popen、subprocess.Popen和Python3的版本之间可能在是否启动一个新shell、这个shell的属性(比如它是否需要从硬盘读取/etc/profile)等方面存在差异。

正如评论中所说,计算密集型的工作会让你的CPU使用率更高,而像"ls -l"这样的IO密集型工作则不会。接下来这个命令可以让我CPU使用率飙升到100%:

while True:
    a = 11*11

撰写回答