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

Flask服务器全局变量is_reading莫名自动切换状态求助

Flask全局布尔变量状态异常切换问题

我已经为这个bug排查了两天,但仍毫无进展。

我的需求抽象实现如下:

  • 搭建Flask服务器,客户端发送read_start POST请求时,将全局布尔变量is_reading设为True
  • 收到read_end POST请求时,将is_reading设为False
  • 启动独立线程,每秒打印一次is_reading的当前值

理论上触发read_start后,is_reading应始终保持True,但实际运行时,它会在True和False之间无限切换,直到收到read_end请求。我尝试在app.run中添加threaded=False,但问题依旧。

代码实现

from flask import Flask, jsonify, request
import time
import json
from flask_cors import CORS
import threading

app = Flask(__name__)
CORS(app)

is_reading = False

def print_reading_state():
    global is_reading
    while True:
        print('is_reading?', is_reading)
        time.sleep(1)

@app.route("/read_start",  methods=['POST'])
def read_start():
    global is_reading
    if request.method == 'POST': # POST request
        is_reading = True
        print('here! change is_reading to', is_reading)
        res = {'result': 'OK', 'status': 200}
        return jsonify(res)
    
@app.route("/read_end",  methods=['POST'])
def read_end():
    global is_reading
    if request.method == 'POST': # POST request
        is_reading = False
        print('here! change is_reading to', is_reading)
        res = {'result': 'OK', 'status': 200}
        return jsonify(res)

if __name__ == '__main__':
    try:
        t1 = threading.Thread(target=print_reading_state)
        t1.daemon = True
        t1.start()
        app.run(debug=True)

    except KeyboardInterrupt:
        print('KeyboardInterrupt')
        is_reading = False
        t1.join()
        print('exit')

问题原因与解决方案

问题出在Flask的debug模式:默认情况下debug模式会启动两个进程(主进程+重载进程),两个进程各自维护独立的is_reading变量副本。当你在一个进程中修改变量为True时,另一个进程的变量还是初始的False,打印时就会交替显示两个不同的值。

解决方法二选一:

  • 关闭debug模式:修改启动代码为app.run(debug=False)
  • 保留debug模式但禁用重载:修改启动代码为app.run(debug=True, use_reloader=False)

另外,多线程环境下操作全局变量建议使用threading.Lock做同步,避免后续出现线程安全问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:38:21