python 服务器 cpu 监控程序--转
发布时间:2020-12-20 12:53:59 所属栏目:Python 来源:网络整理
导读:后台 py 代码 app.py '''服务器cpu监控程序思路:后端后台线程一旦产生数据,即刻推送至前端。好处:不需要前端ajax定时查询,节省服务器资源。作者:hhh5460时间:2017.8.19'''import psutilimport timefrom threading import Lockfrom flask import Flask,
后台 py 代码 app.py''' 服务器cpu监控程序 思路:后端后台线程一旦产生数据,即刻推送至前端。 好处:不需要前端ajax定时查询,节省服务器资源。 作者:hhh5460 时间:2017.8.19 ''' import psutil import time from threading import Lock from flask import Flask,render_template,session,request from flask_socketio import SocketIO,emit # Set this variable to "threading","eventlet" or "gevent" to test the # different async modes,or leave it set to None for the application to choose # the best option based on installed packages. async_mode = None app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' socketio = SocketIO(app,async_mode=async_mode) thread = None thread_lock = Lock() # 后台线程 产生数据,即刻推送至前端 def background_thread(): """Example of how to send server generated events to clients.""" count = 0 while True: socketio.sleep(5) count += 1 t = time.strftime('%M:%S',time.localtime()) # 获取系统时间(只取分:秒) cpus = psutil.cpu_percent(interval=None,percpu=True) # 获取系统cpu使用率 non-blocking socketio.emit('server_response',{'data': [t,*cpus],'count': count},namespace='/test') # 注意:这里不需要客户端连接的上下文,默认 broadcast = True !!!!!!! @app.route('/') def index(): return render_template('index.html',async_mode=socketio.async_mode) # 与前端建立 socket 连接后,启动后台线程 @socketio.on('connect',namespace='/test') def test_connect(): global thread with thread_lock: if thread is None: thread = socketio.start_background_task(target=background_thread) if __name__ == '__main__': socketio.run(app,debug=True) 前端页面 /template/index.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>ECharts3 Ajax</title> <script type="text/javascript" src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script> <script type="text/javascript" src="//cdn.bootcss.com/socket.io/1.5.1/socket.io.min.js"></script> <!-- ECharts 3 引入 --> <script src="http://echarts.baidu.com/dist/echarts.min.js"></script> </head> <body> <!--为ECharts准备一个具备大小(宽高)的Dom--> <div id="main" style="height:500px;border:1px solid #ccc;padding:10px;"></div> <script type="text/javascript"> // 作者:hhh5460 // 时间:2017.8.19 //--- 折柱 --- var myChart = echarts.init(document.getElementById('main')); myChart.setOption({ title: { text: '服务器系统监控' },tooltip: {},legend: { data:['cpu1','cpu2','cpu3','cpu4'] },xAxis: { data: [] },yAxis: {},series: [{ name: 'cpu1',type: 'line',data: [] },{ name: 'cpu2',{ name: 'cpu3',{ name: 'cpu4',data: [] }] }); // 本人笔记本有四个cpu,读者朋友请根据自己的情况,相应修改!! // 五个全局变量:time、cpu1、cpu2、cpu3、cpu4 var time = ["","",""],cpu1 = [0,0],cpu2 = [0,cpu3 = [0,cpu4 = [0,0] //准备好统一的 callback 函数 var update_mychart = function (res) { //res是json格式的response对象 // 隐藏加载动画 myChart.hideLoading(); // 准备数据 time.push(res.data[0]); cpu1.push(parseFloat(res.data[1])); cpu2.push(parseFloat(res.data[2])); cpu3.push(parseFloat(res.data[3])); cpu4.push(parseFloat(res.data[4])); if (time.length >= 10){ time.shift(); cpu1.shift(); cpu2.shift(); cpu3.shift(); cpu4.shift(); } // 填入数据 myChart.setOption({ xAxis: { data: time },series: [{ name: 'cpu1',// 根据名字对应到相应的系列 data: cpu1 },{ name: 'cpu2',data: cpu2 },{ name: 'cpu3',data: cpu3 },{ name: 'cpu4',data: cpu4 }] }); }; // 首次显示加载动画 myChart.showLoading(); // 建立socket连接,等待服务器“推送”数据,用回调函数更新图表 $(document).ready(function() { namespace = '/test'; var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace); socket.on('server_response',function(res) { update_mychart(res); }); }); </script> </body> </html> 效果图(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |