python 基于元类的单例

时间:2021-03-29 11:54:40   收藏:0   阅读:0

创建元类的基类(Singleton)
`
from threading import RLock

class SingletonType(type):
single_lock = RLock()

def __call__(cls, *args, **kwargs):
    with SingletonType.single_lock:
        if not hasattr(cls, ‘_instance‘):
            cls._instance = super(SingletonType, cls).__call__(*args, **kwargs)
    return cls._instance

class Singleton(metaclass=SingletonType):
def init(self, name):
self.name = name

`

s1 = Singleton(‘1 create‘) print(s1.name, id(s1)) s2 = Singleton(‘2 create‘) print(s2.name, id(s2))
运行结果:
技术图片
super 替换为 cls 后运行引发的错误

技术图片

常规锁和Python中的Rlock之间的一个区别是,常规锁可以由不同的线程释放,而重入锁必须由获取它的同一个线程释放,同时要求解锁次数应与加锁次数相同,才能用于另一个线程。另外,需要注意的是一定要避免在多个线程之间拆分锁定操作,如果一个线程试图释放一个尚未获取的锁,Python将引发错误并导致程序崩溃。

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!