You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask-SocketIO图表启停问题:点击停止后服务端函数未终止

问题分析与解决方案

核心问题

  1. 局部变量与全局变量不匹配:start_chart函数内的stop_flag是局部变量,和stop_chart中声明的全局stop_flag完全独立,修改全局变量无法中断start_chart里的循环。
  2. 全局变量的多用户冲突风险:即使全局变量能生效,多个用户同时使用时,一个用户点击停止会影响所有用户的图表进程,不符合多用户场景需求。

修复方案:使用Session存储连接独立的停止标记

Flask-SocketIO的session会为每个客户端连接维护独立的存储空间,完美解决变量隔离问题。

步骤1:配置Flask应用的Secret Key

必须设置secret_key才能使用session,在app初始化时添加:

from flask import Flask, session
from flask_socketio import SocketIO, emit

app = Flask(__name__)
app.secret_key = 'your-random-secret-key-here'  # 替换为随机字符串
socketio = SocketIO(app)

步骤2:修改服务端函数

@socketio.on('start_chart')
def start_chart():
    chart_data = []
    session['stop_flag'] = False  # 初始化当前连接的停止标记
    last_emitted_index = 0

    for i, row in data.iterrows():
        # 检查当前连接的停止标记
        if session.get('stop_flag', False):
            break
        
        timestamp = row['timestamp']
        datapoint = row['datapoint']
        if timestamp == 0:
            continue
        
        chart_data.append({'timestamp': timestamp, 'datapoint': datapoint})
        if i > last_emitted_index:
            emit('update_chart', {'chart_data': chart_data})
            last_emitted_index = i
        
        socketio.sleep(1)  # 每秒推送一次数据
    
    print("Loop Ended")
    session['stop_flag'] = False  # 重置标记,方便下次启动

@socketio.on('stop_chart')
def stop_chart():
    session['stop_flag'] = True  # 设置当前连接的停止标记
    emit('stop_chart')

步骤3:完善客户端代码

确保isChartRunning变量提前初始化,避免未定义错误:

<body>
    <button id="start-btn" onclick="startChart()">Start</button>
    <button id="stop-btn" onclick="stopChart()">Stop</button>
</body>
<script>
var isChartRunning = false; // 提前初始化状态变量

// Start the chart
function startChart() {
    if (!isChartRunning) {
        isChartRunning = true;
        socket.emit('start_chart');
    }
}

// Stop the chart
function stopChart() {
    isChartRunning = false;
    socket.emit('stop_chart');
}
</script>

方案有效性说明

  • 每个客户端连接的session是独立的,修改停止标记只会影响当前用户的图表进程,不会干扰其他用户。
  • start_chart循环中实时读取当前连接的stop_flag,点击停止后下一次循环迭代就会检测到标记并终止循环。

内容的提问来源于stack exchange,提问作者hitseng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:04:59