【问题标题】:RequestHandler variables with threadsafe具有线程安全的 RequestHandler 变量
【发布时间】:2012-12-16 10:36:27
【问题描述】:

如果我有一个RequestHandler 类,它有一个在请求期间初始化的变量(下面的self.var)。可以在并发环境(threadsafe=true)中覆盖该变量吗?例如

class MyRequestHandler(webapp2.RequestHandler):
    var = None
    def get(self, id):
        self.var = value_from_datastore(id)
        # Do something that takes time
        # ...
        self.response.write.out(self.var)
        self.response.write.out(self.var2)

self.var 是否可以在设置在 get 方法的顶部和在输出中使用之间被第二个请求(可能来自不同的用户)覆盖?

谢谢,

贝尔德

更新:

我的(错误的)印象是var = None 将其声明为实例变量。感谢您纠正我的(巨大的)误解;-)

如果我在__init__ 中做“声明”,我会更好吗?我认为这归结为是否为每个线程创建了 MyRequestHandler,或者是否为所有共享线程创建了一个。不同用户的不同请求还会有干扰吗?

class MyRequestHandler(webapp2.RequestHandler):
    def __init__(self):
        self.var = None
    def get(self, id):
        self.var = value_from_datastore(id)
        # Do something that takes time
        # ...
        self.response.write.out(self.var)
        self.response.write.out(self.var2)

谢谢,

贝尔德

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    类变量在 Python 中不是线程安全的。使类变量线程安全。请参阅 Nick Johnson 的this article

    在 webapp2 中,您可以使用应用注册表:http://webapp-improved.appspot.com/guide/app.html#registry。或者,如果您的请求需要“全局”(非共享),您可以使用请求注册表。

    更新:

    类变量与实例变量:

    >>> class A(object):
    ...     a = 10                          # this is a class variable
    ...     def testa(self):
    ...         print A.a
    ...         print self.a
    ...     def adda(self, b):
    ...         self.a = self.a + b     # here we create an instance variable
    ...         
    >>> x = A()
    >>> x.testa()
    10
    10
    >>> A.a = 50
    >>> x.testa()
    50
    50
    >>> x.adda(7)
    >>> x.testa()
    50
    57
    >>> A.a = 15
    >>> x.testa()
    15
    57
    

    【讨论】:

    • 感谢 voscausa,但您是指类上的静态变量还是实例变量?我上面的例子是一个实例变量。我想这归结为 RequestHandler 本身是每个线程唯一的还是在各个线程上共享的。
    • 我已经更新了我的答案,以展示 Python 使用类变量。我可以通过操作类变量来更改实例。
    • 我已经通过初始帖子进行了更新。我想我在这里遇到了纯 python 问题,但是 Google 应用引擎 RequestHandler 实例呢?
    • 现在你的代码是线程安全的,你不要使用“全局”。每个请求都有自己的线程,也许它们使用不同的实例,这取决于负载。但是,另请参阅:stackoverflow.com/questions/11525717/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2012-10-29
    相关资源
    最近更新 更多