3

貼り付けサーバーで実行されているPythonに組み込まれたWebアプリがあります。メソッドスコープの変数に状態を割り当てる@staticmethodを宣言した場合、複数のHTTPリクエストを防ぐために、たとえばthreading.RLock()で保護する必要がありますか(またはより良い方法があります)(貼り付けを次のように想定しています)サーバーには、お互いの状態に干渉することから、着信要求を処理するためのある種のスレッドプールが含まれていますか?

フレームワークとしてGrokを使用していることを指摘しておく必要があります。

それで -

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

上記のことを考えると、スレッド間のgrok / past内でスレッドセーフですか(ここでも、リクエストがスレッドで処理されると仮定しますか?)

4

1 に答える 1

3

ローカル変数は、Javaの場合と同じように、静的メソッド、クラスメソッド、非静的メソッド、スタンドアロン関数のいずれであっても、メソッド呼び出しごとに個別に作成されます。これらのオブジェクトへの参照を明示的に外部のどこかにコピーして、メソッドを存続させ、他のスレッドからアクセスできるようにしない限り、何もロックする必要はありません。

たとえば、CoolClassインスタンス間で共有状態を使用しない限り、これは安全です。

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

オブジェクト参照がスレッド間で共有される可能性があるため、これは安全ではない可能性があります(何を行うかによって異なりますget_cool_inst)。

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、その点では何も変更されていません。

于 2012-03-31T19:02:37.343 に答える