锁定机制作为全局/类范围,在Python中使用多线程

时间:2013-08-21 05:22:41

标签: python python-multithreading

使用锁机制和变量作为全局(外部类作用域)或类变量(在问题中声明)有什么区别? 如:

class httpHandler(BaseHTTPRequestHandler):
    success = 0
    fails = 0
    statsLock = threading.Lock()
    def do_POST(self):
    ...
    httpHandler.statsLock.acquire()
    httpHandler.success += 1
    self.statsLock.release()
    return

或:

success = 0
fails = 0
statsLock = threading.Lock()
class httpHandler(BaseHTTPRequestHandler):

    def do_POST(self):
    ...
    statsLock.acquire()
    success += 1
    statsLock.release()
    return

2 个答案:

答案 0 :(得分:0)

没有太大区别。两种方式都有效。然而,全球是messy and dangerous所以我会远离那个。

答案 1 :(得分:0)

两个示例在功能上都相同,但您应该在第二个示例中使用变量的“全局”定义,因为您修改全局变量成功而没有全局变量,将创建变量的本地副本(请参阅thispython global documentation)。

def do_POST(self):
...
global success, fails, statsLock

statsLock.acquire()
success += 1    # THIS DOES NOT WORK WITHOUT GLOBAL
statsLock.release()
return

无论如何,我认为:

  • 由于简化的变量查找,类范围的变量会稍快一些(有人应该对此进行基准测试!)。
  • 由于“全球”声明以及污染全球范围,全局变量更难维护。