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
锁是否也必须是全局的?如果不是,那么作为本地变量的锁如何不会导致错误?
谢谢。
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
锁是否也必须是全局的?如果不是,那么作为本地变量的锁如何不会导致错误?
谢谢。
counter
需要声明为 global
,而 lock
不需要的原因是你正在对 counter
重新赋值(使用 counter += 1
),而你只是调用了 lock
的方法。对于变量的引用,如果没有局部变量存在,则 Python 会查看封闭作用域直到找到匹配项。在这种情况下,它在全局作用域中找到了它。对于变量的赋值,在未经声明的情况下 Python 将假定该变量为局部变量(使用 global
或 nonlocal
进行显式声明)。class MyCounter:
def __init__(self):
self.lock = threading.Lock()
self.value = 0
def increment(self):
with self.lock:
self.value += 1
MyCounter
实例都有一个锁,并且独立运行。lock
应该像你写的那样是全局的,因为你要保护的资源是全局的。所有使用该资源的代码都需要获取1个锁才能正常工作。 - tdelaneyglobal lock
并在本地命名空间中保存额外的查找。但通常情况下,如果您不重新绑定变量,则不需要使用 global
关键字。 - tdelaney