带有线程安全的RequestHandler变量

时间:2013-01-02 00:35:09

标签: google-app-engine

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

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吗?

谢谢,

Baird的

更新

我(错误的)印象是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)

谢谢,

Baird的

1 个答案:

答案 0 :(得分:2)

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

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

更新:

类变量与实例变量:

>>> 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