为什么NDB上下文缓存设置环境变量?

时间:2014-06-02 09:06:16

标签: google-app-engine app-engine-ndb

纵观Google NDB代码,我似乎无法弄清楚为什么上下文缓存会设置环境变量。

问题中的代码:

https://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/ndb/tasklets.py

_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

(...)

https://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/ext/ndb/utils.py

# 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

1 个答案:

答案 0 :(得分:3)

环境变量特定于/作用于请求,因此提供了一种在代码中的任何位置获取上下文的方法,而无需引用特定的对象/实体或提供请求特定的查找机制。

在从真实环境app.yaml。

处理请求之前设置了一些环境变量

然后对于每个请求,从appengine_config.py设置环境变量,然后是请求的WSGI环境,然后是处理程序,然后是其他组件贡献(即您的代码可能填充环境),这是特定于每个请求

因此,环境被视为线程安全(即不会在并发请求中泄漏事物)