flask+socketio+echarts3 服务器监控程序(基于后端数据推送)

本文地址:http://www.cnblogs.com/hhh5460/p/7397006.html

说明

以前的那个例子的思路是后端监控数据存入数据库;前端ajax定时查询数据库

这几天在看websocket。前端有一个js库:socket.io.js,后端python也有很多库实现了websocket,flask就有一个好用的扩展:flask-socketio。

在参考了这里之后,将前面那个例子改写成后端后台线程一旦产生数据,即刻推送至前端

好处是不需要前端ajax定时查询,节省服务器资源

项目一共两个文件:

  • app.py
  • templates/index.htmll

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)

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',
            type: 'line',
            data: []
        },{
            name: 'cpu3',
            type: 'line',
            data: []
        },{
            name: 'cpu4',
            type: 'line',
            data: []
        }]
    });

    // 本人笔记本有四个cpu,读者朋友请根据自己的情况,相应修改!!
    // 五个全局变量:time、cpu1、cpu2、cpu3、cpu4
    var time = ["","","","","","","","","",""],
        cpu1 = [0,0,0,0,0,0,0,0,0,0],
        cpu2 = [0,0,0,0,0,0,0,0,0,0],
        cpu3 = [0,0,0,0,0,0,0,0,0,0],
        cpu4 = [0,0,0,0,0,0,0,0,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>

效果图

时间: 2024-08-02 05:39:37

flask+socketio+echarts3 服务器监控程序(基于后端数据推送)的相关文章

JavaScript数据推送Comet技术详解_javascript技巧

JavaScript数据推送主要致力于webapp的在线推送服务,不用我们每次都像服务器去发送Ajax请求而主动从Server端推送数据到本地. 数据推送进化史: 1. HTTP协议简易轮询,保持着一个链接不放,或者通过前端不停的向后端发送请求 2. H5更新后有了WebSocket大大改善了双向和单向推送数据的便利性 3. SSE(Server-Send Event):服务器推送数据的新方式  Comet:基于 HTTP 长连接的服务器推送技术 本课时介绍Comet:基于 HTTP 长连接的服

Node.js实现数据推送_node.js

场景:后端更新数据推送到客户端(Java部分使用Tomcat服务器). 后端推送数据的解决方案有很多,比如轮询.Comet.WebSocket. 1. 轮询对于后端来说开发成本最低,就是按照传统的方式处理Ajax请求并返回数据,在学校的时候实验室的项目一直都采用轮询,因为它最保险也最容易实现.但轮询带来的通信资源的浪费是无法忽视的,无论数据是否改变,都照常发送请求并响应,而且每次HTTP请求都带有很长的头部信息. 2. Comet的概念是长连接,客户端发送请求后,后端将连接保持下来,直到连接超时

IOS 基于APNS消息推送原理与实现(JAVA后台)

IOS 基于APNS消息推送原理与实现(JAVA后台) Push的原理: Push 的工作机制可以简单的概括为下图   图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider. APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器. 上图可以分为三个阶段. 第一阶段:Push服务器应用程序把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自

消息-自己的服务器和百度云涂推送的连接问题

问题描述 自己的服务器和百度云涂推送的连接问题 现在想通过第三方平台来实现消息的推送.那么问题来了:自己的服务器要怎么和百度云推送连接,才能实现服务器把消息推给百度云然后由百度云推送到客户端呢? 在此先谢过各位热心伙伴. 解决方案 百度云本身就有推送接口,你往对应接口发送数据不就可以了 解决方案二: 现在百度下载的Baidu-Push-SDK-Java-1.1.2这个SDK这么使用,求指教,里面很多包,我也找不到相对应的文档说明 解决方案三: 想要实现web消息推送,用Goeasy吧,这都是我最

java web 客户端订阅 数据推送

问题描述 java web 客户端订阅 数据推送 推送数据是从第三方拿到的,怎么推给请求这些数据的web页面.注:我的程序和第三方数据源只保持一个连接,这个连接一直接受第三方推过来的数据:每个web页面可能请求的数据也不一样 解决方案 java web服务器推送数据到客户端(pushlet) 解决方案二: 你好,我的理解,推送数据最好是走数据缓存,定时刷新页面的取数比较好,而且每个页面数据也不一样,最好是存下来后再分类取 解决方案三: 想要建立实时web,推荐GoEasy的web实时推送,他们是

Android高仿微信实时聊天:基于百度云推送

一直在仿微信界面,今天终于有幸利用百度云推送仿一仿微信聊天了~~~ 首先特别感谢:weidi1989分享的Android之基于百度云推送IM ,大家可以直接下载:省了很多事哈,本例中也使用了weidi的部分代码,凡是@author way的就是weidi1989的代码~~ 1.效果图 核心功能也就上面的两张图了~~~我拿着手机和模拟器聊天,同时感谢群里的兄弟姐妹帮忙测试(好友列表中). 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.c

php基于curl主动推送最新内容给百度收录的方法_php技巧

本文实例讲述了php基于curl主动推送最新内容给百度收录的方法.分享给大家供大家参考,具体如下: php curl的好处可以以最快的方式并且模仿post提供我们的url地址给百度搜索引擎进行收录. 百度链接提交三种方式: 1.主动推送:最为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录. 2.sitemap:您可以定期将网站链接放到sitemap中,然后将sitemap提交给百度.百度会周期性的抓取检查您提交的sitemap,对其中的链接进行

在Ajax应用程序中实现实时数据推送

这种技术可能会生成大量不必要的流量和非最优化的应用程序.幸运的是,某些富 Internet 应用程序(RIA)技术确实允许打开专用套接字通道,由后端服务器为 Asynchronous JavaScript and XML (Ajax) 应用程序提供进入其 API 并实现服务器推送的机会.这篇文章以多种方式探讨了这项技术,帮助您充分理解,以便着手开始进行自己的实现工作. 简介 Ajax 技术已经存在了一段时间,开发的动力已经真正开始得到了人们的认可.越来越多的 Web 站点正在考虑使用 Ajax

基于短信网关WAP推送的实现

中介交易 SEO诊断 淘宝客 云主机 技术大厅 摘要 WAP PUSH既有信息发送主动.及时的特点,又有可随时随地接收信息的优势,因而具有良好的应用前景.该文简单介绍了WAP PUSH系统框架.推送协议和推送方式, 重点介绍了通过短信网关实现WAP推送的实现方法. 关键词 无线应用协议,WAP推送,短信网关,PDU 模式 1 WAP推送技术简介 1.1 什么是WAP推送 WAP推送(PUSH)技术是一种建立在客户服务器上的机制,就是由服务器主动将信息发往客户端的技术.同传统的拉(PULL)技术相