锁是否需要声明为全局?

时间:2016-11-30 01:10:50

标签: python-3.x

Python 3.x

import threading

lock = threading.Lock()
counter = 0

def update_counter():
    global counter

    lock.acquire()
    counter += 1
    lock.release()

# starts threads, target update_counter

锁还必须是全局的吗?如果没有,它是如何不导致错误的,因为没有定义本地锁?

谢谢

2 个答案:

答案 0 :(得分:1)

要直接回答问题,{​​{1}}需要声明counterglobal的原因并不是因为您要重新分配到lock(与counter)而你只是在counter += 1上调用方法。对于对变量的引用,如果不存在局部变量,Python将查找封闭范围,直到找到匹配为止。在这种情况下,它会在全局范围内找到它。对于变量的赋值,Python将假设变量是local,除非另有明确声明(使用lockglobal)。

答案 1 :(得分:0)

锁可以保护某些资源,并且通常与资源的作用域相同。在您的情况下,您正在保护全局计数器,因此锁也必须是全局的。访问资源的所有线程必须使用相同的锁,因此在函数本身中创建私有锁不会有任何好处 - 没有其他线程可以看到它。

某些应用程序使用单个锁来保护所有共享资源(过程粒度锁定)。但是您也可以使用数据保持锁定(细粒度锁定)。细粒度锁定的一个例子是:

class MyCounter:

    def __init__(self):
        self.lock = threading.Lock()
        self.value = 0

    def increment(self):
        with self.lock:
            self.value += 1

现在,MyCounter的每个实例都有一个锁并独立运行。