2012-03-31 6 views
2

私はpythonでビルドされたWebアプリケーションをペーストサーバーから実行しています。 method-scoped変数に状態を代入する@staticmethodを宣言していれば、複数のHTTPリクエストを防ぐために、例えばthreading.RLock()でそれを保護する必要があります(または、より良い方法です)。サーバーには着信要求を処理するためのスレッドプールの種類が含まれています)が互いの状態を妨害することはありませんか?私はpython webappに@staticmethodを持っていれば、threading.RLock()でそれを保護する必要がありますか?

私はフレームワークとしてGrokを使用しています。

がそう -

@staticmethod 
def doSomeStuff(): 
abc = 1 
...some code... 
abc = 5 

は上記の、それはスレッド間GROK /ペーストの内部スレッドセーフである

+1

メソッドスコープの変数では、ローカル変数を意味しますか?コードサンプルが役に立ちます。 – bereal

+0

はい、申し訳ありませんが、メソッド内でローカル変数が割り当てられています。 – rutherford

+0

もう別のことを明らかにする。それらの変数はローカルですが、それらはオブジェクト参照ですが、そうではありませんか?そうであれば、それらは作成され、方法の中で死ぬか、またはどこか他の場所へと/そこに保存されますか?このために – bereal

答えて

0

ローカル変数は、メソッドごとに作成される(要求を仮定すると、再びスレッドで処理されています?)静的メソッド、クラスメソッド、非静的メソッド、またはスタンドアロン関数のいずれであっても、Javaと同じ方法で別々に呼び出します。これらのオブジェクトへの参照を明示的に外部にコピーしない限り、それらがメソッドに残って他のスレッドからアクセスできるようにするために、何もロックする必要はありません。 CoolClassがインスタンス間の任意の共有状態を使用しない限り

例えば、これは安全である:オブジェクト参照は、スレッド(get_cool_instが何を行うかに依存する)の間で共有することができるので

def my_safe_method(*args): 
    my_cool_object = CoolClass() 
    my_cool_object.populate_from_stuff(*args) 
    return my_cool_object.result() 

これは安全でない可能性があります。

def my_suspicious_method(*args): 
    my_cool_object = somewhere.get_cool_inst() 
    my_cool_object.populate_from_stuff(*args) 
    # another thread received the same instance 
    # and modified it 
    # (my_cool_object is still local, but it's a reference to a shared object) 
    return my_cool_object.result() 

publish株式参照場合、これは、あまりにも危険なことができます。

def my_suspicious_method(*args): 
    my_cool_object = CoolClass() 
    # puts somewhere into global namespace, other threads access it 
    publish(my_cool_object) 
    my_cool_object.prepare(*args) 
    # another thread modifies it now 
    return my_cool_object.result() 

編集:あなたが提供したコードサンプルは完全にスレッドセーフで、@staticmethodはその点で何も変更されませんでした。

関連する問題