纵观Google NDB代码,我似乎无法弄清楚为什么上下文缓存会设置环境变量。
问题中的代码:
_CONTEXT_KEY = '__CONTEXT__'
def get_context():
# XXX Docstring
ctx = None
if os.getenv(_CONTEXT_KEY):
ctx = _state.current_context
if ctx is None:
ctx = make_default_context()
set_context(ctx)
return ctx
(...)
def set_context(new_context):
# XXX Docstring
os.environ[_CONTEXT_KEY] = '1'
_state.current_context = new_context
我知道它的作用,但为什么呢? (在我身边的推测被删除,我不想误导答案)
_state基于以下代码:
class _State(utils.threading_local):
"""Hold thread-local state."""
current_context = None
(...)
# Define a base class for classes that need to be thread-local.
# This is pretty subtle; we want to use threading.local if threading
# is supported, but object if it is not.
if threading.local.__module__ == 'thread':
logging_debug('Using threading.local')
threading_local = threading.local
else:
logging_debug('Not using threading.local')
threading_local = object
答案 0 :(得分:3)
环境变量特定于/作用于请求,因此提供了一种在代码中的任何位置获取上下文的方法,而无需引用特定的对象/实体或提供请求特定的查找机制。
在从真实环境app.yaml。
处理请求之前设置了一些环境变量然后对于每个请求,从appengine_config.py设置环境变量,然后是请求的WSGI环境,然后是处理程序,然后是其他组件贡献(即您的代码可能填充环境),这是特定于每个请求
因此,环境被视为线程安全(即不会在并发请求中泄漏事物)