Flask_单例模式
2024-08-29 08:51:39
在flask实现单例模式的方法有多种:
这里我们列举五种,行吗?
第一种:
国际惯例:基于文件导入
第二种:
基于类的单例模式:
它又分两种: 一种加锁,一种不加锁。
不加锁的话,可以并发,但是我们的初衷是单例。
加了锁的话,可以多线程,缺陷也很明显 看代码
# 单例模式:无法支持多线程情况 # class Singleton(object): # def __init__(self): # import time # time.sleep(1) # # @classmethod # def instance(cls,*args,**kwargs): # if not hasattr(Singleton,'_instance') # # 每一个线程来,创建了一次 # Singleton._instance = Singleton(*args,**kwargs) # return Singleton._instance # # import threading # # def task(arg): # obj = Singleton.instance() # print(obj) # for i in range(4): # t = threading.Thread(target=task,args=[i,]) # t.start() """ <__main__.Singleton object at 0x10225e240> <__main__.Singleton object at 0x10227ddd8> <__main__.Singleton object at 0x10227deb8> <__main__.Singleton object at 0x1022a25c0> """ # 单例模式:支持多线程(加锁!!!!!!!) # 该方法的缺陷: 要告诉使用者,以后使用单例模式,要用Singleton.instance()!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! import time import threading class Singleton: def __init__(self): time.sleep(1) _instance_lock = threading.Lock() @classmethod def instance(cls,*args,**kwargs): if not hasattr(Singleton,'_instance'): # 加锁 with Singleton._instance_lock: if not hasattr(Singleton,'_instance'): Singleton._instance = Singleton(*args,**kwargs) return Singleton._instance def task(arg): obj = Singleton.instance() print(obj) for i in range(10): t = threading.Thread(target=task,args=[i,]) t.start() """ <__main__.Singleton object at 0x102265160> <__main__.Singleton object at 0x102265160> <__main__.Singleton object at 0x102265160> <__main__.Singleton object at 0x102265160> <__main__.Singleton object at 0x102265160> <__main__.Singleton object at 0x102265160> <__main__.Singleton object at 0x102265160> <__main__.Singleton object at 0x102265160> <__main__.Singleton object at 0x102265160> <__main__.Singleton object at 0x102265160> """
鸡鱼类的两种单例
第三种:__new__方法。
########################## 基于__new__方式实现 ######################### import time import threading class Singleton(object): _instance_lock = threading.Lock() def __init__(self): pass def __new__(cls, *args, **kwargs): if not hasattr(Singleton, "_instance"): with Singleton._instance_lock: if not hasattr(Singleton, "_instance"): Singleton._instance = object.__new__(cls, *args, **kwargs) return Singleton._instance # 单例模式,obj = Singleton() # 和基于类的单例相比,好在 这个实例化是正常实例化。 # 示例 obj1 = Singleton() obj2 = Singleton() print(obj1,obj2)
基于__new__实现单例
第四种:基于metaclass实现的单例
import threading import time """ class SingletonType(type): def __init__(self,*args,**kwargs): super(SingletonType, self).__init__(*args,**kwargs) def __call__(cls, *args, **kwargs): obj = cls.__new__(cls,*args,**kwargs) cls.__init__(obj,*args,**kwargs) print(obj) return obj class Foo(metaclass=SingletonType): def __init__(self,name): self.name = name def __new__(cls, *args, **kwargs): return object.__new__(cls) obj = Foo('name') print(obj) """ import threading class SingletonType(type): _instance_lock = threading.Lock() def __call__(cls, *args, **kwargs): if not hasattr(cls,'_instance'): with SingletonType._instance_lock: if not hasattr(cls,'_instance'): cls._instance = super(SingletonType, cls).__call__(*args,**kwargs) return cls._instance class Foo(metaclass=SingletonType): def __init__(self,arg): self.arg = arg obj1 = Foo(') obj2 = Foo(') print(obj1,obj2) # <__main__.Foo object at 0x102240668> <__main__.Foo object at 0x102240668>
最新文章
- prolog 内部谓词
- hdu4939 Stupid Tower Defense (DP)
- Thinkpad 笔记本VMware Workstation 安装虚拟机出现&ldquo;此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态&rdquo;解决方法
- Windows下 使用CodeBlocks配置OpenGL开发环境
- 使用StarUML创建类图
- Android应用开发多语言drawable目录
- 1230.2——iOS准备(阅读开发者文档时的笔记)
- ceph理论及部署配置实践
- usaco1.1.1Your Ride Is Here(入门题)
- gulp3 和 gulp4 区别
- 前端工程化系列[04]-Grunt构建工具的使用进阶
- Django Rest framework 之 认证
- ARM总线架构
- Mininet安装
- LightOJ 1074 - Extended Traffic (SPFA)
- LED音乐频谱之输入数据处理
- ArcEngine和GDAL读写栅格数据机制对比(一)
- handsontable-developer guide-setting options,callback
- SublimeText 改变 tab的距离
- margin和spacing的区别
热门文章
- 大会聚焦 | 开源技术盛会LinuxCon首次来到中国,大咖齐聚关注业界动态
- HDU 2089 不要62 (数位DP,入门)
- LeetCode Happy Number 开心数字
- mvc的help和functions语法
- 【UML】用例图Use Case diagram(转)
- UVA11478 Halum (差分约束)
- netbackup如何手动获取主机ID证书。
- [numpy] 基础练习 (一)
- 解除phpMyAdmin导入大型MySQL数据库文件大小限制
- PAT (Basic Level) Practise (中文)- 1014. 福尔摩斯的约会 (20)