我有一个python 3类。
我想同步所有方法,即使在多线程中也只能同时执行一个方法。
实施的最佳方法是什么?
@synchronized
class Library(object):
def __init__(self):
pass
def method1(self):
pass
def method2(self):
pass
答案 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