網站首頁 編程語言 正文
獲取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并沒有跑滿,哪怕開了多線程后CPU利用率仍然不高。
這是因為在默認情況下,Python 程序是單個進程,使用單 CPU 核心執行,這意味著多核處理器只使用了一個核。
「一核有難九核圍觀」意味著超過 50% 的算力都會被浪費。這篇文章將介紹如何解決這種情況。
多線程無法增加cpu使用率的原因
GIL 的全程為 Global Interpreter Lock ,意即全局解釋器鎖。
在 Python 語言的主流實現 CPython 中,GIL 是一個貨真價實的全局線程鎖,在解釋器解釋執行任何 Python 代碼時,都需要先獲得這把鎖才行,在遇到 I/O 操作時會釋放這把鎖。
如果是純計算的程序,沒有 I/O 操作,解釋器會每隔 100 次操作就釋放這把鎖,讓別的線程有機會執行(這個次數可以通過 sys.setcheckinterval 來調整)。
所以雖然 CPython 的線程庫直接封裝操作系統的原生線程,但 CPython 進程做為一個整體,同一時間只會有一個獲得了 GIL 的線程在跑,其它的線程都處于等待狀態等著 GIL 的釋放。
這就意味著哪怕開了多線程CPU使用率仍然不會很高。
如何充分使用多核跑程序
有三個辦法
1. multiprocessing
multiprocessing 是多進程標準庫,讓多進程的 python 程序編寫簡化到類似多線程的程度,通過多進程的方式使用多個CPU核心。
2. C 語言擴展機制
如果不想用多進程這樣重量級的解決方案,可以改用 C/C++。當然,你也不用做的這么絕,只需要把關鍵部分用 C/C++ 寫成 Python 擴展,其它部分還是用 Python 來寫,讓 Python 的歸 Python,C 的歸 C。一般計算密集性的程序都會用 C 代碼編寫并通過擴展的方式集成到 Python 腳本里(如 NumPy 模塊)。這樣在擴展里就完全可以用 C 創建原生線程,就可以充分利用 CPU 的計算資源了。
3. ctypes
不過,寫 Python 擴展總是讓人覺得很復雜。好在 Python 還有另一種與 C 模塊進行互通的機制 : ctypes。ctypes 與 Python 擴展不同,它可以讓 Python 直接調用任意的 C 動態庫的導出函數。你所要做的只是用 ctypes 寫些 python 代碼即可。
原文鏈接:https://blog.csdn.net/weixin_45775963/article/details/104193207
相關推薦
- 2024-04-02 Springboot 切換Log4j2日志
- 2022-11-28 iOS中NSThread使用示例詳解_IOS
- 2022-11-01 如何使用Kubernetes自定義資源(CRD)詳解_云其它
- 2022-11-05 Golang操作命令行的幾種方式總結_Golang
- 2022-04-10 小程序播放文件流音頻
- 2023-10-09 時間戳轉日期格式-自動補零,日期格式轉時間戳
- 2022-08-07 使用pd.merge表連接出現多余行的問題解決_python
- 2022-08-18 Flutter中關于angle的踩坑記錄_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支