Flask服务器全局变量is_reading莫名自动切换状态求助
Flask全局布尔变量状态异常切换问题
我已经为这个bug排查了两天,但仍毫无进展。
我的需求抽象实现如下:
- 搭建Flask服务器,客户端发送
read_startPOST请求时,将全局布尔变量is_reading设为True - 收到
read_endPOST请求时,将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
相关产品推荐
相关产品推荐

