request 为什么能在任何地方直接用?它是怎么做到每个请求互不干扰的?新线程里为什么读不到?全局变量安全吗?这篇用真实的多线程把每一层都验证一遍。
type(request) = LocalProxy | 真实对象 = Request type(g) = LocalProxy | 真实对象 = _AppCtxGlobals type(current_app) = LocalProxy | 真实对象 = Flask Werkzeug Local 的存储: Local 的源码里用到了 ContextVar: True | 用到了 threading.local: False
三个线程各自读到: {'A': '/a', 'B': '/b', 'C': '/c'}
上下文外访问 request.path → Working outside of request context.新线程里直接读 request.path → RuntimeError: Working outside of request context. 用 copy_current_request_context 包装后 → /parent
内层 g.v = inner 回到外层 g.v = outer 请求上下文里的 g 就是它所属应用上下文的 g: True 1
100 次并发 POST:不加锁的计数 = 29(期望 100),加锁的计数 = 100