GAE命名空间是否可以安全地与线程安全一起使用?

时间:2012-09-12 16:19:46

标签: google-app-engine

我有一个使用命名空间组织数据的GAE应用程序。我的问题是 - 是基于每个线程还是基于每个实例管理命名空间?如果我在GAE配置中启用线程安全,是否可能在一个线程中设置命名空间会影响其他线程?

2 个答案:

答案 0 :(得分:5)

set_namespace()使用os.environ

def set_namespace(namespace):
    ...
    os.environ[_ENV_CURRENT_NAMESPACE] = namespace
已修补

os.environ以使用线程本地存储。

所以,名称空间是线程安全的。

答案 1 :(得分:0)

看起来名称空间在GAE / J上是线程安全的。

已通过运行执行以下操作的简单servlet对此进行了测试:

  • 将命名空间设置为查询字符串参数
  • 循环25秒,每5秒记录一次命名空间,以及线程ID
  • 使用三个不同的命名空间调用servlet 3次,每次调用之间暂停10秒

使用< threadsafe> true< / threadsafe>在appengine-web.xml中设置所有请求都由同一个实例处理。通过检查应用引擎控制台中正在运行的实例数以及检查每个请求的日志来验证这一点。每个日志条目都有一个条目,如:instance = 00c61b117c8e9fd8aa8b02bff53de32a49b20e。在同一实例中,在线程上设置命名空间不会影响其他线程上的命名空间。

要确认配置中的线程安全设置是否正常,它已设置为false并且运行相同的测试。正如所料,每个请求都会启动一个新实例。