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 框架中全局变量的使用与管理问题

6 回复

控制台输出和 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 上.

请问怎么改的?

回到顶部