Python获取CPU使用率及多核利用率优化方案
本文介绍如何使用Python的psutil模块实时监控并持久化保存CPU每秒使用率。针对Python多线程无法充分利用多核CPU的问题,深入解析GIL机制的影响,并提供multiprocessing多进程、C语言扩展及ctypes调用动态库三种解决方案,帮助开发者充分利用计算资源。
监控CPU每秒使用率
需求说明
需要获取指定时间段内的CPU占用数据,并以持久化方式存储保存。
实现代码示例
import psutil
import time
# cpu_res = psutil.cpu_percent()
# print(cpu_res)
# 每一秒获取获取cpu的占有率 --->持久化保存
# 如何将时间和对应的cpu占有率去匹配
while True:
# 获取当前时间和cpu的占有率
t = time.localtime()
cpu_time = '%d:%d:%d' % (t.tm_hour, t.tm_min, t.tm_sec)
cpu_res = psutil.cpu_percent()
print(cpu_res)
# 保存在文件中
with open('cpu.txt', 'a+') as f:
f.write('%s %s \n' % (cpu_time, cpu_res))
time.sleep(1)1. 使用psutil模块获取本机硬件信息
2. 调用psutil.cpu_percent()函数获取CPU占用率
3. 利用元组时间格式精确记录时、分、秒
4. 将时间戳与CPU占用率数据写入cpu.txt文件
5. 使用time.sleep(1)设置1秒休眠,控制执行频率
运行结果展示

在cpu.txt文件中查看记录

Python充分利用CPU资源
当使用Python处理大规模数据或运行耗时较长的程序时,常发现CPU并未满载,即使启用多线程后利用率依然偏低。
这是因为默认情况下Python程序为单进程,仅使用单个CPU核心执行,导致多核处理器中其他核心闲置。
这种现象被称为“一核有难九核围观”,意味着超过50%的算力被浪费。本文将介绍解决此问题的方法。
多线程无法提升CPU使用率的原因
GIL的全称是Global Interpreter Lock,即全局解释器锁。
在Python主流实现CPython中,GIL是一个真实存在的全局线程锁。解释器执行任何Python代码前必须先获取该锁,遇到I/O操作时会释放锁。
对于纯计算型程序(无I/O操作),解释器每执行100次操作会释放一次锁,允许其他线程执行(该次数可通过sys.setcheckinterval调整)。
因此,尽管CPython线程库封装了操作系统原生线程,但作为整体,同一时刻仅有一个获得GIL的线程在运行,其他线程处于等待状态。
这导致即使开启多线程,CPU使用率依然不会显著升高。
如何充分利用多核运行程序
主要有三种方法
1. multiprocessing模块
multiprocessing是多进程标准库,使多进程Python程序的编写简化至类似多线程的程度,通过多进程方式利用多个CPU核心。
2. C语言扩展机制
若不想采用多进程这种重量级方案,可改用C/C++。无需完全重写,只需将关键部分用C/C++编写为Python扩展,其余部分仍用Python。通常计算密集型程序会用C代码编写并通过扩展集成到Python脚本中(如NumPy模块)。在扩展中可完全使用C创建原生线程,从而充分利用CPU计算资源。
3. ctypes模块
编写Python扩展往往较为复杂。Python提供了另一种与C模块互通的机制:ctypes。与Python扩展不同,ctypes允许Python直接调用任意C动态库的导出函数。只需使用ctypes编写少量Python代码即可实现。
以上为个人经验总结,希望能提供参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













