PYTHON通过psutil模块实时监测cpu、内存、网速运行情况

运行多线程以后,随着设置更多的线程数,运行效率并没提升,一定是遇到了瓶颈,到底是CPU、内存还是网速到了上限?做了个实时监测,看看多线程的资源消耗情况吧。

一、安装psutil

pip install psutil即可。

二、初步学习psutil

import psutil as p

1.cpu

p.cpu_times()

Python psutil python psutil动态网络监控_Python psutil

这些时间是系统累计数,实时监测需要计算差值。

这里我们用p.cpu_percent()

Python psutil python psutil动态网络监控_Python psutil_02

取出百分比。

2.内存

Python psutil python psutil动态网络监控_Python psutil_03

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

Python psutil python psutil动态网络监控_Python psutil_04

3.网速

Python psutil python psutil动态网络监控_字节数_05

得到的发送和接收数,也是统计数,需要计算差值。

三、思路

cpu、内存就取使用的百分比作为指示,因为同是百分比,放在一个图中;网速取单位时间接收到的字节数,转化为对应带宽(直观)作为指示,新增第二个图。显示监测的窗口增加了置顶功能。

四、代码

# CPU、内存、网速实时监控
import matplotlib.pyplot as plt
 import matplotlib.font_manager as font_manager
 import psutil as p
 import win32gui,win32condef 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()


五、运行结果

Python psutil python psutil动态网络监控_多线程_06

Python psutil python psutil动态网络监控_多线程_07

右边为开启多线程(网络应用)监测情况,cpu、内存基本上达到了满负荷状态。