Python中实现单例模式

单例模式

  • 在面向对象中,使用单例模式。对实例对象可复用性

  • 确保一个类只有一个实例

  • 减少内存开销

  • 类似于维护一个全局变量的变量

  • 如何实现单利模式

    • __new__ 实现单利模式
    • python 文件导入 实现单利模式
    • 多线程 对 单利对象 上锁
  • 使用场景

    • python 文件导入,也可实现单利模式

      # from 和 import 导入一次后。不再导入第二次
      得到的logger 对象就是一个 单利对象,不会创建第二个
      
    • 数据库连接池

    • 频繁创建对象场景

    • 线程池

      • 多线程遇到 IO 阻塞时,会造成重新 实例化对象。 解决办法:对创建对象的函数 __new__方法 上锁🔒

        # -*-coding:utf-8-*-
        # 多线程时,需要对对象创建函数。上锁
        import threading
        import time
        
        
        class Singleton(object):
            instance = None
            lock = threading.Lock()
        
            def __init__(self, i):
                self.i = i
        
            def __new__(cls, *args, **kwargs):
                # 如果有实例对象,直接返回
                if cls.instance:
                    return cls.instance
                # 上锁。阻止IO阻塞,线程被挂起
                with cls.lock:
                    if not cls.instance:
                        time.sleep(1) # 模拟线程阻塞
                        cls.instance = object.__new__(cls)
                    return cls.instance
        
        
        def task(args):
            obj = Singleton(args)
            print(obj)
        
        
        for i in range(10):
            thread = threading.Thread(target=task, args=(i,))
            thread.start()
        
        time.sleep(10)
        return_obj = Singleton(1)
        print("return_obj:", return_obj)
        
        
    • 日志文件 对象

    • 网站计数器

    • django 使用到单例模式

      • django-admin的admin.site.register()。 将model注册到 Register对象的字典中
      • 配置文件 settings。 将全局配置gloabl_setting 和 自定义配置导入 ,django web对象中
posted @ 2024-04-17 00:19  染指未来  阅读(17)  评论(0编辑  收藏  举报