您的位置:时时app平台注册网站 > 编程知识 > python 实现线程安全的单例模式【时时app平台注册

python 实现线程安全的单例模式【时时app平台注册

2019-11-28 03:20

 

代码也比较轻巧,将类传入单例修饰器中,若是此类还没生成实例(instances中不设有此类),那么就生成多少个新的实例重回,并记录在instances中。假诺已经instances中已经存在这里类,那么直接重回实例instances[cls]。

 

举例说,服务器的配备新闻写在叁个文件中online.conf中,客商端通过几个Config 的类来读取配置文件的剧情。假设在程序运行时期,有过多地点都急需运用计划文件的内容,那么每种调用配置文件的地点都会创制Config的实例,那就诱致系统中设有两个Config 的实例对象,在计划文件内容超级多的图景下,我们就浪费了汪洋的内部存款和储蓄器做了大器晚成致的事。事实上,对于Config类大家在程序运行时期时只须求贰个实例对象就能够,那个时候单例格局正是最佳的选择。

单例情势是风华正茂种不关痛痒的设计格局,该情势的最首要指标是作保某多个类独有一个实例存在。当你希望在漫天系统中,有些类只好现身贰个实例时,单例对象就能够派上用处。

这正是说这段代码是完备的吗?答案是还是不是认的,这段代码不是线程安全的。要完成线程安全须要合作锁的行使,唯有据有锁的线程技巧连续拜望单例实例,看来大家要求再写一个修饰器来贯彻线程安全了,以下是总体的代码达成和轻松的三十六线程测量试验用例。

def Singleton(cls):
    instances = {}

    def get_instance(*args, **kw):
        if cls not in instances:
            instances[cls] = cls(*args, **kw)
        return instances[cls]

    return get_instance
#!/usr/bin/python
# -*- coding: utf-8 -*-

import threading


def synchronized(func):
    func.__lock__ = threading.Lock()

    def synced_func(*args, **kws):
        with func.__lock__:
            return func(*args, **kws)

    return synced_func


def Singleton(cls):
    instances = {}

    @synchronized
    def get_instance(*args, **kw):
        if cls not in instances:
            instances[cls] = cls(*args, **kw)
        return instances[cls]

    return get_instance


def worker():
    single_test = test()
    print "id----> %s" % id(single_test)


@Singleton
class test():
    a = 1

if __name__ == "__main__":
    task_list = []
    for one in range(30):
        t = threading.Thread(target=worker)
        task_list.append(t)

    for one in task_list:
        one.start()

    for one in task_list:
        one.join()

python的模块便是天生的单例格局,这里大家接受修饰器来达成单例格局,以下是代码完结

 

 

本文由时时app平台注册网站发布于编程知识,转载请注明出处:python 实现线程安全的单例模式【时时app平台注册

关键词: