我在python中运行了一个运行粘贴服务器的webapp。如果我已声明一个@staticmethod将状态分配给方法范围的变量我是否必须使用例如threading.RLock()保护它(或者有更好的方法)以防止多个HTTP请求(我假设粘贴为服务器包含某种服务于传入请求的线程池干扰彼此的状态?
我应该指出我使用Grok作为我的框架。
所以 -
@staticmethod
def doSomeStuff():
abc = 1
...some code...
abc = 5
鉴于上述情况,它是否在线程之间的grok / paste中是线程安全的(同样,假设请求在线程中处理?)
答案 0 :(得分:2)
为每个方法调用分别创建局部变量,无论它是静态方法,类方法,非静态方法还是独立函数,都与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
在这方面没有任何改变。