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

如何在Flask中实现页面刷新后数据不丢失?线程列表刷新清空问题解决

问题原因

你遇到的列表清空问题本质是Flask的运行机制导致的:

  • 如果你把process列表定义在视图函数内部,每次刷新页面相当于发起一次新的HTTP请求,Flask会重新执行视图函数的全部代码,列表会被重新初始化,之前存储的内容自然丢失
  • 如果你是开了debug模式运行,Flask默认会启动两个进程用于热重载,两个进程内存空间相互独立,就算定义了全局变量,两个进程的变量也不互通,也会出现看起来内容丢失的情况
  • 多worker部署场景下(比如用Gunicorn开多个进程),每个worker都有独立的内存空间,全局变量同样无法跨进程共享
解决方案

单进程自用/测试场景

如果是小流量、单进程运行的场景,直接把列表放到应用全局作用域,同时关闭debug模式的热重载即可:

from flask import Flask
import threading

app = Flask(__name__)
# 全局存储线程列表,也可以直接绑定到app实例属性上
process_list = []

def start():
    # 你的线程执行逻辑
    pass

@app.route('/')
def index():
    t = threading.Thread(target=start)
    process_list.append(t)
    t.start()
    return "线程已启动"

if __name__ == '__main__':
    # 关闭debug模式,或者加use_reloader=False禁用热重载,避免启动双进程
    app.run(debug=False)

多进程部署/生产场景

注意:线程对象是内存中的运行时对象,无法序列化,不能直接存储到Redis、数据库这类外部存储中跨进程共享
这种场景需要调整实现思路:

  • 不要直接存储线程对象,改为存储线程对应的任务ID、运行状态、执行参数等可序列化的信息,将这些信息存入Redis、SQLite等外部公共存储
  • 单独实现一个全局的线程管理器,放在主进程中运行,统一负责线程的启动、停止、状态查询,不要跨进程传递线程对象
注意事项
  • 自行管理线程的生命周期和异常捕获,避免请求结束后产生僵尸线程
  • 不要在视图函数中启动长时间运行的线程,可能会导致请求阻塞、资源泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:45:04