我有一个Python烧瓶网页应用,需要在多个请求之间共享一个全局变量。应用程序长时间运行,全局变量的值偶尔会发生变化。
这是代码的样子......
app.py
from flask import Flask
from my_module import my_function
data = 0 # global variable initialize to 0
app = Flask(__name__)
@app.route('/do/some/work', methods=[GET])
def work():
my_function(data)
@app.route('/modify/global/var', methods=[GET])
def modify():
global data
data = 5
if __name__ == '__main__':
app.run()
这是当前的问题......
第一次加载应用程序时,data = 0
。
我点击了/do/some/work
个端点5次,我在my_function
使用data = 0
的位置得到了一致的结果。
然后我点击/modify/global/var
个端点一次,它将全局变量数据修改为data = 5
。
我再次点击/do/some/work
端点5次。现在它给出了不一致的结果。有时它使用data = 5
,有时它会在第一次初始化时使用data = 0
。
唯一有效的解决方案是重新启动应用程序并将data
初始化为正确的值...但是,当然,当应用程序在生产中投入使用时,这不是一个选项......
这是我到目前为止所尝试过的......
separate_module.py
中。以下示例...... separate_module.py
class GlobalData(object):
def __init__(self):
self.data = 0
def modify(self):
self.data = 5
...然后import
ing GlobalData
,实例化其对象并使用它来修改全局变量data
并将其传递给my_function()
。
from separate_module import GlobalData
...
gd = GlobalData()
...
def work():
my_function(gd.data)
...
def modify():
gd.modify()
仍然产生相同的不一致结果......
GlobalData
global
范围内删除并重新app.py
对象,然后再进行修改。 def modify():
del gd
global gd
gd = GlobalData()
gd.modify()
...我假设对对象进行硬删除会从内存中删除旧数据的所有引用,但仍会产生相同的结果...
问题...
我做错了什么?我该如何解决?