如何同步类python3中的所有方法?

时间:2019-04-29 02:46:17

标签: python-3.x

我有一个python 3类。

我想同步所有方法,即使在多线程中也只能同时执行一个方法。

实施的最佳方法是什么?

@synchronized
class Library(object):

    def __init__(self):
        pass

    def method1(self):
        pass

    def method2(self):
        pass

1 个答案:

答案 0 :(得分:2)

您可以编写一个装饰器来锁定单个函数或方法。

from functools import wraps
from threading import Lock

def sychronized(lock):
    def wrapper(f):
        @wraps(f)
        def inner_wrapper(*args, **kwargs):
            with lock:
                return f(*args, **kwargs)
        return inner_wrapper
    return wrapper

要防止一个类的两个方法同时运行,必须用相同的Lock装饰所有方法。您可以再次编写装饰器来实现此目的,但是我更喜欢用__init_subclass__来编写mixin。

class Sychronized:
    def __init_subclass__(cls, **kwargs):
        sychronizer = sychronized(Lock())
        for name in cls.__dict__:
            attr = getattr(cls, name)
            if callable(attr):
                setattr(cls, name, sychronizer(attr))

用法

class Library(Sychronized):
    def __init__(self):
        pass

    def method1(self):
        pass

    def method2(self):
        pass