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)
今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...
随机推荐
- ArcServer10.1系列产品之ArcGIS Web Adaptor (IIS)
1.关于 ArcGIS Web Adaptor 通过 ArcGIS Web Adaptor,可以将 ArcGIS for Server 与您现有的 Web 服务器进行集成.ArcGIS Web Ada ...
- dstat参数选项
Usage: dstat [-afv] [options..] [delay [count]]Versatile tool for generating system resource statist ...
- 2017.10.1 QBXT 模拟赛
题目链接 T1 枚举右端点,前缀和优化.对于当前点x,答案为 sum[x][r]-sum[x][l-1]-(sum[z][r]-sum[z][l-1]) 整理为 sum[x][r]-sum[z][r] ...
- Nuget~管理自己的包包
很久很久以前,自己就想有个包包,最近又从网上淘了一个,价格不便宜呢,99块,还是个小腰包,不过作工还算精良,我喜欢的类型,帆布休闲包,可以将我的手机,耳机,水,小烟,小酒,小伞都放里,方便至极,哈哈!
- Update主循环的实现原理
从写一段程序,到写一个app,写一个游戏,到底其中有什么不同呢?一段程序的执行时间很短,一个应用的执行时间很长,仅此而已.游戏中存在一个帧的概念. 这个概念大家都知道,类比的话,它就是电影胶卷的格.一 ...
- Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B "Or" Game (贪心)
首先应该保证二进制最高位尽量高,而位数最高的数乘x以后位数任然是最高的,所以一定一个数是连续k次乘x. 当出现多个最高位的相同的数就枚举一下,先预处理一下前缀后缀即可. #include<bit ...
- UVA 1614 - Hell on the Markets 奇怪的股市(贪心,结论)
先证明一个结论吧,对于1≤ai≤i+1,前面ai个数一定可以凑出1~sum[i]中的任意一个数. 对于i=1显然成立, 假设对于i=k结论成立,那么对于i=k+1来说,只要证明sum[k]+i,1≤i ...
- Vue中使用computed与watch结合实现数据变化监听
目的:当数据变化时,为其中重要数据增加边框,实现闪烁以达到提醒目的.数据格式如下,只有在未处理火警/故障时增加闪烁边框.可以使用watch进行深度监听.数据格式已定,也非常明确要监听的数据是有两个.既 ...
- 香港城市大学:全球首创3D打印微型机器人技术 有望作治疗癌症用途
香港城市大学(香港城大)的研究团队开发出了全球首创以磁力控制的3D打印微型机器人,该微型机器人技术能做到在生物体内精准运载细胞到指定的位置.新研发的微型机器人有望应用在治疗癌症的靶向治疗,并为细胞层面 ...
- 从输入url到页面加载完成发生了什么详解
这是一道经典的面试题,这道题没有一个标准的答案,它涉及很多的知识点,面试官会通过这道题了解你对哪一方面的知识比较擅长,然后继续追问看看你的掌握程度.当然我写的这些也只是我的一些简单的理解,从前端的角度 ...