了解Python WSGI应用程序中的全局对象持久性
请考虑Google App Engine中我的WebApp2应用程序中的以下代码:了解Python WSGI应用程序中的全局对象持久性,python,google-app-engine,wsgi,webapp2,Python,Google App Engine,Wsgi,Webapp2,请考虑Google App Engine中我的WebApp2应用程序中的以下代码: count = 0 class MyHandler(webapp2.RequestHandler): def get(self): global count count = count + 1 print count 每次刷新页面时,计数都会增加 我来自PHP世界,每个请求都是一个新的全局环境。我的理解是,因为我正在使用WebApp2的wsgi配置,
count = 0
class MyHandler(webapp2.RequestHandler):
def get(self):
global count
count = count + 1
print count
每次刷新页面时,计数都会增加
我来自PHP世界,每个请求都是一个新的全局环境。我的理解是,因为我正在使用WebApp2的wsgi配置,所以Python不会在每个请求上启动一个新进程。另一方面,如果我使用cgi配置,全局环境每次都会重新实例化,比如PHP
假设以上是正确的(如果不是,请纠正我)
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
这些请求也会增加您对情况的分析是正确的,Python web应用程序是一个长期运行的过程。启动Python解释器需要很长时间,并且不是每个请求都能完成 完全可以创建不同于“每个请求”的全局变量。这是在许多框架中完成的,人们似乎喜欢它。这样做的方式取决于服务器。大多数服务器使用“每个请求一个线程”,我认为GAE也一样。如果是这种情况,您可以使用。如果您担心这个值在该线程上的请求之间徘徊,那么您将需要一些可以挂接到请求开始/结束的管理代码。如果WebApp2框架没有提供一种很好的方法,那么WSGI中间件就是一个很好的地方 它只是Python,请求在它自己的线程中提供。从那里你可以做你想做的事。Python中没有任何东西可以重置所有全局变量,通常也不能保证(尤其是使用GAE)每次为您的请求提供服务的进程都是相同的进程,这意味着除非您真的知道自己在做什么,否则不应该使用全局变量在请求之间持久化数据
有很多框架已经为这项工作提供了很好的支持,所以如果WebApp2没有,那么我建议去别处看看。Python有很多选项,其中很多都在GAE上运行。您的理解是正确的。如果希望变量在请求期间保持不变,则不应将其设置为全局变量—在RequestHandler类中设置为实例变量,以
self.var
访问。由于为每个请求实例化了一个新的RequestHandler,所以只要需要,变量就会一直存在。除非您确实需要全局(而不是特定于请求的)范围,否则最好避免使用全局变量
还请注意,您的应用程序引擎应用程序将在多个服务器上运行;全局服务器只能访问同一服务器内的请求。 在第一个问题的情况下,我想你可以考虑这个特性。它是一个dict,用于存储不同模块在请求生命周期内可以共享的实例
另一方面,它也很有用。在这种情况下,实例在请求之间持久存在,并且可以在应用程序的生命周期内为应用程序的任何需要而共享(和重用),从而避免在全局范围内创建实例。谢谢。你能看看我的编辑吗?我试过threading.local(),但是这个计数和我的全局计数一样递增。我实现的对吗?您的请求可能来自同一个线程。大多数WSGI服务器都是使用线程池实现的,因此每个请求不一定是一个新线程。我也不熟悉GAE服务器WSGI应用程序的内部工作原理,但这正是我所期望的。您尝试将全局数据存储在数据存储之外有什么具体原因吗?似乎您正在尝试的事情可以用一个@Kevin更容易地完成-那个count变量只是一个例子-我的实际情况完全是另一回事-我只是想了解应用程序域中的全局范围。相关