gpt4 book ai didi

python - 将线程同步责任移至共享资源中

转载 作者:行者123 更新时间:2023-12-01 05:04:59 25 4
gpt4 key购买 nike

给定一个由多个线程使用的对象(=实例),以下方法是最常见的(据我所知):

共享资源:

class Resource():
def return_some_value(self):
return self.somevalue

全局(或父上下文):

lock = Lock()
res = Resource()

在访问线程内:

lock.acquire()
res.return_some_value()
lock.release()

显然,访问线程负责锁定和解锁共享资源。

让我们假设共享资源更复杂,并且某些方法/属性是只读的,而其他方法/属性则不是。使用资源的线程现在必须知道哪个是哪个并相应地锁定。这显然很容易出错,而且我有时无法选择将 Lock 对象放在哪里。

现在我的问题:是否可以将正确锁定共享资源本身的责任转移?这还有道理吗?像这样的东西:

class Resource():
def __init__(self):
self.lock = Lock()
def return_some_value(self):
self.lock.acquire()
return self.somevalue
self.lock.release() # obviously this won't work

最佳答案

是的,这样做非常有意义。您还可以use a Lock as a context manager确保它始终被释放:

class Resource():
def __init__(self):
self.lock = Lock()

def return_some_value(self):
with self.lock: # Lock gets acquired
return self.somevalue # Lock gets released

Lock 的所有者基于获取它的线程。许多不同的调用者可以从不同的线程调用您的 Resource 对象,并且锁将表现得适当。

如果您需要在 Resource 上调用多个方法,而这需要您始终卡在锁上,那么这种方法就不太适用。在这种情况下,您可能需要考虑使资源本身可锁定:

class Resource():
def __init__(self):
self.lock = Lock()

def __enter__(self):
self.lock.acquire()

def __exit__(self, *args, **kwargs):
self.lock.release()

def return_some_value(self):
return self.somevalue

def some_method(self):
# stuff

def some_other_method(self):
# stuff

r = Resource()
with r:
r.some_method()
r.some_other_method()
val = r.return_some_value()

关于python - 将线程同步责任移至共享资源中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25220373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com