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
锁还必须是全局的吗?如果没有,它是如何不导致错误的,因为没有定义本地锁?
谢谢
答案 0 :(得分:1)
要直接回答问题,{{1}}需要声明counter
和global
的原因并不是因为您要重新分配到lock
(与counter
)而你只是在counter += 1
上调用方法。对于对变量的引用,如果不存在局部变量,Python将查找封闭范围,直到找到匹配为止。在这种情况下,它会在全局范围内找到它。对于变量的赋值,Python将假设变量是local,除非另有明确声明(使用lock
或global
)。
答案 1 :(得分:0)
锁可以保护某些资源,并且通常与资源的作用域相同。在您的情况下,您正在保护全局计数器,因此锁也必须是全局的。访问资源的所有线程必须使用相同的锁,因此在函数本身中创建私有锁不会有任何好处 - 没有其他线程可以看到它。
某些应用程序使用单个锁来保护所有共享资源(过程粒度锁定)。但是您也可以使用数据保持锁定(细粒度锁定)。细粒度锁定的一个例子是:
class MyCounter:
def __init__(self):
self.lock = threading.Lock()
self.value = 0
def increment(self):
with self.lock:
self.value += 1
现在,MyCounter
的每个实例都有一个锁并独立运行。