我是否必须为多线程锁定所有调用一个或多个锁定函数的函数?

Do I have to lock all functions that calls to one or more locked function for multi-threading?

好的,我一直在 this article 阅读 python 中有关以正确方式锁定重要语句的内容。

例子是

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

所以这是我的问题,我有一个串行设备控件class,其中的每个函数都调用了重要的语句(函数需要线程锁(RLock))。

有些函数只调用 get_first_part(),有些函数同时调用两者,有些更复杂,可能会调用 first、second、third、first 等。

所以我的问题是我是否必须在 class 中的每个此类函数中放置 lock.aquire() 和 release ?锁定和释放所有这些功能的首选方法是什么?使用装饰器 ?

谢谢。

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 语句让您可以更好地了解哪些部分确实需要该锁(任何准备和 post-处理可以发生在获取锁之前和释放锁之后)。因此,在这种情况下,我通常会使用优雅的 with,而不是使用装饰器的 "gross grained" 方法。