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の先頭に設定されてから出力で使用されるまでの間に、(おそらく別のユーザーからの)2番目の要求によって上書きできますか?get

ありがとう、

ベアード

アップデート:

var = None私は、がインスタンス変数として宣言しているという(誤った)印象を受けました。私の(ギャップのある)誤解を訂正してくれてありがとう;-)

で「宣言」を行う場合__init__、私はより良いですか?MyRequestHandlerがスレッドごとに作成されるのか、それともすべての共有スレッドに1つしかないのかということになると思います。さまざまなユーザーによるさまざまな要求からの干渉がまだ存在する可能性はありますか?

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ではスレッドセーフではありません。クラス変数をスレッドセーフにするため。NickJohnsonのこの記事を参照してください。

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 に答える