如果我的python webapp中有@staticmethod,我是否需要使用threading.RLock()来保护它?

如果我的python webapp中有@staticmethod,我是否需要使用threading.RLock()来保护它?,python,multithreading,static,paste,grok,Python,Multithreading,Static,Paste,Grok,我有一个内置python的webapp,它运行在粘贴服务器上。如果我声明了一个@staticmethod,它将状态分配给方法作用域变量,那么我是否必须使用例如threading.RLock()来保护它(或者有更好的方法)以防止多个HTTP请求(我假设作为服务器的粘贴包含某种线程池来服务传入请求)干扰彼此的状态 我应该指出,我使用Grok作为我的框架 所以- 鉴于上述情况,线程之间的grok/paste是否是线程安全的(同样,假设请求在线程中处理?为每个方法调用分别创建局部变量,无论是静态方法、类

我有一个内置python的webapp,它运行在粘贴服务器上。如果我声明了一个@staticmethod,它将状态分配给方法作用域变量,那么我是否必须使用例如threading.RLock()来保护它(或者有更好的方法)以防止多个HTTP请求(我假设作为服务器的粘贴包含某种线程池来服务传入请求)干扰彼此的状态

我应该指出,我使用Grok作为我的框架

所以-


鉴于上述情况,线程之间的grok/paste是否是线程安全的(同样,假设请求在线程中处理?

为每个方法调用分别创建局部变量,无论是静态方法、类方法、非静态方法还是独立函数,方法与Java中相同。除非您显式地将这些对象的引用复制到外部的某个位置,以便它们在方法中生存并可以从其他线程访问,否则您不必锁定任何内容

例如,这是安全的,除非
CoolClass
在实例之间使用任何共享状态:

def my_safe_method(*args):
    my_cool_object = CoolClass()
    my_cool_object.populate_from_stuff(*args)
    return my_cool_object.result()
这可能是不安全的,因为对象引用可能在线程之间共享(取决于
get\u cool\u inst
的功能):

如果
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
在这方面没有任何更改。

通过方法范围的变量,您是指本地变量吗?代码示例会很有帮助。是的,对不起,在方法中指定了局部变量。现在,让我们澄清另一件事。这些变量是局部变量,但它们是对象引用,不是吗?如果是这样的话,它们是在方法内部创建和死亡,还是从其他地方获取/保存到其他地方?为此,请在方法内部创建和死亡。
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()
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()