1. 程式人生 > 實用技巧 >PYTHON通過psutil模組實時監測cpu、記憶體、網速執行情況

PYTHON通過psutil模組實時監測cpu、記憶體、網速執行情況

PYTHON通過psutil模組實時監測cpu、記憶體、網速執行情況

執行多執行緒以後,隨著設定更多的執行緒數,執行效率並沒提升,一定是遇到了瓶頸,到底是CPU、記憶體還是網速到了上限?做了個實時監測,看看多執行緒的資源消耗情況吧。

一、安裝psutil

pip install psutil即可。

二、初步學習psutil

import psutil as p

1.cpu

p.cpu_times()

這些時間是系統累計數,實時監測需要計算差值。

這裡我們用p.cpu_percent()取出百分比。

2.記憶體

我們用p.virtual_memory().percent得到百分比。

3.網速

得到的傳送和接收數,也是統計數,需要計算差值。

三、思路

cpu、記憶體就取使用的百分比作為指示,因為同是百分比,放在一個圖中;網速取單位時間接收到的位元組數,轉化為對應頻寬(直觀)作為指示,新增第二個圖。顯示監測的視窗增加了置頂功能。

四、程式碼

# CPU、記憶體、網速實時監控

import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager
import psutil as p
import win32gui,win32con

def show():#增加視窗置頂功能
global hwnd

#win32gui.SetForegroundWindow (hwnd)#這句好象不行
win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0,0,500,400, \
win32con.SWP_NOMOVE | win32con.SWP_NOACTIVATE| \
win32con.SWP_NOOWNERZORDER|win32con.SWP_SHOWWINDOW)

POINTS = 300
fig, ax = plt.subplots(2,facecolor='#FFDAB9')#設定上下兩個圖、面板色。#,edgecolor='#7FFF00'好象無效

fig.canvas.set_window_title(u'電腦效能(cpu、記憶體、網速)實時監測')#設定視窗標題
fig.canvas.toolbar.destroy()#取消工具欄
fig.canvas.callbacks.callbacks.clear()#清除回撥資訊

#ax為列表,分別設定
ax[0].set_ylim([0, 100])
ax[0].set_xlim([0, POINTS])
ax[0].set_autoscale_on(False)
ax[0].set_xticks([])
ax[0].set_yticks(range(0, 101, 20))
#ax[0].set_facecolor('#A9A9A9')#可設定底色,支援'black')#matplotlib顏色分層設定
ax[0].grid(True)

ax[1].set_ylim([-5, 50])#設定0線上浮
ax[1].set_xlim([0, POINTS])
ax[1].set_autoscale_on(False)
ax[1].set_xticks([])
ax[1].set_yticks(range(0, 51, 10))
ax[1].grid(True)

# 設定CPU、記憶體橫座標資料位
cpu = [None] * POINTS
mem=[None] * POINTS
# 設定接收位元組(下載)橫座標資料位
down = [None] * POINTS
#設定第一個圖
cpu_l, = ax[0].plot(range(POINTS), cpu, label='Cpu%')
mem_l, = ax[0].plot(range(POINTS), mem, label='Mem%')
ax[0].legend(loc='upper center', ncol=4, prop=font_manager.FontProperties(size=10))#打標
#設定第二個圖
down_l, = ax[1].plot(range(POINTS), down, label='Down(M)')
ax[1].legend(loc='upper center', ncol=4, prop=font_manager.FontProperties(size=10))

before =p.net_io_counters().bytes_recv#獲取網路位元組數
#把查詢視窗控制代碼放在這裡,不在SHOW()裡,
hwnd=win32gui.FindWindow(None,u'電腦效能(cpu、記憶體、網速)實時監測')#查詢本視窗控制代碼
print(hwnd)#除錯用
#把win32gui.SetWindowPos(放在這裡不行列。

def get_delta():#獲取下載變化值
global before
now = p.net_io_counters().bytes_recv
delta = (now-before)/102400#變成K再除100,大致相當於多少M寬頻。
before = now
return delta #返回改變數

def OnTimer(ax):
global cpu, mem, down
show()
tmp = get_delta()#得到下載位元組數的變化值
cpu_p=p.cpu_percent()#讀取CPU使用百分比
cpu = cpu[1:] + [cpu_p]#加入到資料末尾
mem_p=p.virtual_memory().percent#讀取記憶體使用百分比
mem =mem[1:] + [mem_p]#加入到資料末尾
cpu_l.set_ydata(cpu)#設定新資料
mem_l.set_ydata(mem)#設定新資料

down = down[1:] + [tmp]
down_l.set_ydata(down)#設定新資料
###下面這部分可以忽略
## while True:
## try:
## ax.draw_artist(cpu_l)
## ax.draw_artist(mem_l)
## ax.draw_artist(down_l)
## break
## except:
## pass
ax.figure.canvas.draw()#重新整理畫布


def start_monitor():
timer = fig.canvas.new_timer(interval=1000)#1秒重新整理一次
timer.add_callback(OnTimer, ax[1])#只加一個即可
#timer.add_callback(OnTimer, ax[0])
timer.start()
plt.show()


if __name__ == '__main__':
start_monitor()
五、執行結果

右邊為開啟多執行緒(網路應用)監測情況,cpu、記憶體基本上達到了滿負荷狀態。