Python web.py 框架中全局变量的使用与管理问题
import threading
import time
import web
global bianliang
bianliang=0
class Test:
global bianliang
def GET(self):
return str(bianliang)
def _listen_yushui():
while True:
time.sleep(2)
global bianliang
print bianliang
def _add():
while True:
time.sleep(2)
global bianliang
bianliang=bianliang+1
urls=(
‘/test’,‘Test’
)
application = web.application(urls, globals())
if name == “main”:
yushui = threading.Thread(target=_listen_yushui)
yushui.setDaemon(True)
yushui.start()
add = threading.Thread(target=_add)
add.setDaemon(True)
add.start()
application.run()
上面的代码在运行时,控制台输出可以看到 bianliang 的值在不断的增加;但是发送一个网络请求'your_url/test',请求到的结果却是 bianliang 的初始值 0 ,这是为什么?
Python web.py 框架中全局变量的使用与管理问题
控制台输出和 webserver 属于不同进程
在web.py框架里,全局变量确实是个需要小心处理的问题。web.py默认是单线程的,但部署时(比如用gunicorn)可能会是多进程或多线程环境,这会导致全局变量在不同请求间共享,引发数据混乱。
核心解决方案是使用web.ctx。这是web.py为每个请求创建的线程局部存储,完美隔离不同请求的数据。比如你想在每个请求里跟踪用户ID:
import web
urls = ('/', 'index')
app = web.application(urls, globals())
class index:
def GET(self):
# 设置请求特定的数据
web.ctx.user_id = 123
# 在其他地方使用
current_id = web.ctx.user_id
return f"User ID: {current_id}"
如果必须用真正的全局变量(比如配置信息),确保它是只读的,或者在应用启动时初始化:
# 应用启动时初始化
config = {'debug': True}
class index:
def GET(self):
# 只读取,不修改
if config['debug']:
return "Debug mode"
绝对不要在请求处理中修改可变全局变量(如列表、字典),否则会出现竞态条件。如果需要在请求间共享状态,应该用数据库、Redis或文件系统这些外部存储。
总结:优先用web.ctx,全局变量只读不写。
用过 web.var_name=“value”
感谢,已成功
redis 上.
请问怎么改的?

