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