Flask_单例模式
在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>
Flask_单例模式的更多相关文章
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- 23种设计模式--单例模式-Singleton
一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- java设计模式之--单例模式
前言:最近看完<java多线程编程核心技术>一书后,对第六章的单例模式和多线程这章颇有兴趣,我知道我看完书还是记不住多少的,写篇博客记录自己所学的只是还是很有必要的,学习贵在坚持. 单例模 ...
- 设计模式C#合集--单例模式
单例模式 代码: 第一种: private static Singleton singleton = null; private Singleton() { } public static Singl ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
- GOF23设计模式之单例模式
·核心作用: -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. ·常见应用场景: -Windows的Task Manager(任务管理器)就是很典型的单例模式 -Windows的Recy ...
- GJM : C#设计模式(1)——单例模式
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- PHP设计模式(四)单例模式(Singleton For PHP)
今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...
随机推荐
- ubuntu和window之间如何共享文件
参考网上的自己动手实现共享文件: 1.打开虚拟机进入ubuntu系统,先安装增强功能包 2.安装完重启虚拟机后,在window下创建一个专门用来共享的文件夹 3.切换到ubuntu系统,在设备的共享文 ...
- js屏蔽鼠标右键事件
<script type="text/javascript">function stops(){ return false;}document.oncontextmen ...
- redis 知识归档
中文版redis命令 http://www.redis.net.cn/order/ redis例子 https://github.com/ServiceStack/ServiceStack.Ex ...
- SharePoint 2013 安装配置(1)
在这篇文章中,我将逐步介绍在Windows Server 2012 R2上安装SharePoint 2013. 在进一步详细介绍之前,让我们先了解SharePoint 2013安装的硬件和软件要求.您 ...
- webpack-dev-server配置指南webpack3.0
最近正在研究webpack,听说webpack可以自己搭建一个小型的服务器(使用过vue-cli的朋友应该都见识到过),所以迫不及待的想要尝试一下.不过,在实际操作中发现,用webpack搭建服务器仍 ...
- 使用ServiceController组件控制计算机服务
实现效果: 知识运用: ServiceController组件的MachineName属性 //获取或设置服务所驻留的计算机名称 public string MachineName{get;set;} ...
- java中的同步与异步
在多线程的环境中,经常会碰到数据的共享问题,即当多个线程需要访问同一个资源时,它们需要以某种顺序来确保该资源在某--时刻只能被-一个线程使用,否则,程序的运行结果将会是不可预料的,在这种情况下就必须对 ...
- 通过脚本批量添加AD用户
1.新建一个csv文件(逗号分隔的一种值文件) 内容为:放在C:\盘根目录下 test300 test300 .com test300 test301 test301 .com test301 tes ...
- linux之切换用户su(switch user)
1.切换至root su 或 su root然后输入密码 这种只切换身份,不切换home工作目录 su - 或 su - root然后输入密码 这种不仅切换身份,而且切换home工作目录 2.切换至普 ...
- js函数式编程(二)-柯里化
这节开始讲的例子都使用简单的TS来写,尽量做到和es6差别不大,正文如下 我们在编程中必然需要用到一些变量存储数据,供今后其他地方调用.而函数式编程有一个要领就是最好不要依赖外部变量(当然允许通过参数 ...