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对象中
-