Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解Python WSGI应用程序中的全局对象持久性_Python_Google App Engine_Wsgi_Webapp2 - Fatal编程技术网

了解Python WSGI应用程序中的全局对象持久性

了解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配置,

请考虑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
    

    这些请求也会增加

    您对情况的分析是正确的,Python web应用程序是一个长期运行的过程。启动Python解释器需要很长时间,并且不是每个请求都能完成

    完全可以创建不同于“每个请求”的全局变量。这是在许多框架中完成的,人们似乎喜欢它。这样做的方式取决于服务器。大多数服务器使用“每个请求一个线程”,我认为GAE也一样。如果是这种情况,您可以使用。如果您担心这个值在该线程上的请求之间徘徊,那么您将需要一些可以挂接到请求开始/结束的管理代码。如果WebApp2框架没有提供一种很好的方法,那么WSGI中间件就是一个很好的地方

    它只是Python,请求在它自己的线程中提供。从那里你可以做你想做的事。Python中没有任何东西可以重置所有全局变量,通常也不能保证(尤其是使用GAE)每次为您的请求提供服务的进程都是相同的进程,这意味着除非您真的知道自己在做什么,否则不应该使用全局变量在请求之间持久化数据


    有很多框架已经为这项工作提供了很好的支持,所以如果WebApp2没有,那么我建议去别处看看。Python有很多选项,其中很多都在GAE上运行。

    您的理解是正确的。如果希望变量在请求期间保持不变,则不应将其设置为全局变量—在RequestHandler类中设置为实例变量,以
    self.var
    访问。由于为每个请求实例化了一个新的RequestHandler,所以只要需要,变量就会一直存在。除非您确实需要全局(而不是特定于请求的)范围,否则最好避免使用全局变量


    还请注意,您的应用程序引擎应用程序将在多个服务器上运行;全局服务器只能访问同一服务器内的请求。

    在第一个问题的情况下,我想你可以考虑这个特性。它是一个dict,用于存储不同模块在请求生命周期内可以共享的实例


    另一方面,它也很有用。在这种情况下,实例在请求之间持久存在,并且可以在应用程序的生命周期内为应用程序的任何需要而共享(和重用),从而避免在全局范围内创建实例。

    谢谢。你能看看我的编辑吗?我试过threading.local(),但是这个计数和我的全局计数一样递增。我实现的对吗?您的请求可能来自同一个线程。大多数WSGI服务器都是使用线程池实现的,因此每个请求不一定是一个新线程。我也不熟悉GAE服务器WSGI应用程序的内部工作原理,但这正是我所期望的。您尝试将全局数据存储在数据存储之外有什么具体原因吗?似乎您正在尝试的事情可以用一个@Kevin更容易地完成-那个count变量只是一个例子-我的实际情况完全是另一回事-我只是想了解应用程序域中的全局范围。相关