我是否必须锁定调用一个或多个锁定函数的所有函数以进行多线程处理?

时间:2015-01-19 03:24:07

标签: python multithreading locking

好的,我一直在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()和释放在类中的每一种这样的函数中吗?锁定和重新锁定所有这些功能的首选方法是什么?使用装饰器?

感谢。

1 个答案:

答案 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;在这种情况下,装饰者的方法。