好的,我一直在python中以正确的方式阅读有关锁定重要语句的this article。
示例是
lock = threading.Lock()
def get_first_part():
lock.acquire()
try:
... fetch data for first part from shared object
finally:
lock.release()
return data
def get_second_part():
lock.acquire()
try:
... fetch data for second part from shared object
finally:
lock.release()
return data
def get_both_parts():
lock.acquire()
try:
first = get_first_part()
second = get_second_part()
finally:
lock.release() # The finally block will alway execute no mater what before this, not matter return/break/continue. https://docs.python.org/2/tutorial/errors.html
return first, second
所以这是我的问题,我有一个串行设备控制类,它的每个函数都调用了重要的语句(函数需要一个线程锁(RLock))。
有些函数只调用get_first_part(),其中一些调用两者,其中一些更复杂,可能会调用第一,第二,第三,第一等。
所以我的问题是我必须把lock.aquire()和释放在类中的每一种这样的函数中吗?锁定和重新锁定所有这些功能的首选方法是什么?使用装饰器?
感谢。
答案 0 :(得分:1)
with
语句更好:
lock = threading.RLock()
def get_first_part():
with lock:
return ...data for first part...
等等。
是的,当然,如果您愿意,可以使用装饰器:
import functools
def withlock(func):
@functools.wrap(func)
def wrapper(*a, **k):
with lock:
return func(*a, **k)
return wrapper
然后
@withlock
def get_first_part():
return ...data for first part...
然而,所有功能的整体需要始终保持锁定是不寻常的,而with
语句可以让您更准确地了解锁定所需的部分(任何准备和发布)处理可以在获取之前和释放之后发生。所以我通常选择优雅with
,而不是去追求#34;粗粒度#34;在这种情况下,装饰者的方法。