werkzeug
没有使用threading.loca
而是自己实现了werkzeug.local.local
类
相比 threading.local
,werkzeug.local.local
的优势:
1.在有greenlet
的时候,优先使用greenlet
id,而不是thread
id,既它支持协程,而thread.local
只支持线程
2.实现了werkzeug
的__release_local__
,可以被自己的release_pool
函数析构,释放当前线程的状态,避免thread.local
可能产生的脏数据.
此外werkzeug
还实现了LocalStack
和LocalProxy
两种数据结构.
LocalStack
是用Local
实现的栈结构,可以将对象推入,弹出,或拿到栈顶的对象,所有的修改都只在本线程中可见.
LocalProxy
是代理模式实现的,在构造时接收一个callable的参数,这个callable被调用后返回值是一个Thread Local
对象.对LocalProxy
的所有操作,包括属性访问,方法调用,都会转发到Thread Local
对象上.
https://blog.tonyseek.com/post/the-context-mechanism-of-flask/
https://cizixs.com/2017/01/13/flask-insight-context/