如果我有一个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的
答案 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