1

如果我有一个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)

谢谢,

贝尔德

4

1 回答 1

2

类变量在 Python 中不是线程安全的。使类变量线程安全。请参阅尼克约翰逊的这篇文章

在 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
于 2013-01-02T02:07:41.300 回答