【发布时间】:2011-12-31 12:59:30
【问题描述】:
在我的 Google App Engine 中的 WebApp2 应用程序中考虑以下代码:
count = 0
class MyHandler(webapp2.RequestHandler):
def get(self):
global count
count = count + 1
print count
每次刷新页面时,计数都会增加。
我来自 PHP 世界,每个请求都是一个新的全局环境。我理解这里发生的是,因为我使用 WebApp2 的 wsgi 配置,Python 不会在每个请求上启动一个新进程。另一方面,如果我使用 cgi 配置,全局环境每次都会重新实例化,就像 PHP...
假设以上是正确的(如果不是,请纠正我)...
- 如何处理我希望全局变量仅在请求的生命周期内持续存在的情况?我可以在 RequestHandler 类中放置一个实例变量,但是我导入的实用程序模块之类的东西如何使用全局变量来存储消息对象?
- 是否有某种技术可以重置所有变量或强制重新实例化环境?
- 全球环境会无限期地持续下去,还是会在某个时候自行重置?
- 此 GAE 是否特定于任何一个,或者 wsgi 全局持久性在任何服务器场景中的工作方式都相同?
编辑:
这是使用 threadlocal 的尝试:
count = 0
mydata = threading.local()
mydata.count = 0
class MyHandler(webapp2.RequestHandler):
def get(self):
global count
count = count + 1
print count
mydata.count = mydata.count + 1
print mydata.count
这些也会随着请求而增加
【问题讨论】:
-
您尝试将全局数据存储在数据存储之外是否有特定原因?使用sharded counter 似乎可以更轻松地完成您的尝试。
-
@Kevin- count 变量只是一个例子-我的实际情况完全是另外一回事-我只是想了解应用程序域中的全局范围。
标签: python google-app-engine wsgi webapp2