在flask实现单例模式的方法有多种:

这里我们列举五种,行吗?

第一种:

  国际惯例:基于文件导入

第二种:

  基于类的单例模式:

    它又分两种: 一种加锁,一种不加锁。

          不加锁的话,可以并发,但是我们的初衷是单例。

          加了锁的话,可以多线程,缺陷也很明显 看代码

  1. # 单例模式:无法支持多线程情况
  2. # class Singleton(object):
  3. # def __init__(self):
  4. # import time
  5. # time.sleep(1)
  6. #
  7. # @classmethod
  8. # def instance(cls,*args,**kwargs):
  9. # if not hasattr(Singleton,'_instance')
  10. # # 每一个线程来,创建了一次
  11. # Singleton._instance = Singleton(*args,**kwargs)
  12. # return Singleton._instance
  13. #
  14. # import threading
  15. #
  16. # def task(arg):
  17. # obj = Singleton.instance()
  18. # print(obj)
  19. # for i in range(4):
  20. # t = threading.Thread(target=task,args=[i,])
  21. # t.start()
  22. """
  23. <__main__.Singleton object at 0x10225e240>
  24. <__main__.Singleton object at 0x10227ddd8>
  25. <__main__.Singleton object at 0x10227deb8>
  26. <__main__.Singleton object at 0x1022a25c0>
  27. """
  28.  
  29. # 单例模式:支持多线程(加锁!!!!!!!)
  30. # 该方法的缺陷: 要告诉使用者,以后使用单例模式,要用Singleton.instance()!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  31. import time
  32. import threading
  33. class Singleton:
  34. def __init__(self):
  35. time.sleep(1)
  36. _instance_lock = threading.Lock()
  37. @classmethod
  38. def instance(cls,*args,**kwargs):
  39. if not hasattr(Singleton,'_instance'):
  40. # 加锁
  41. with Singleton._instance_lock:
  42. if not hasattr(Singleton,'_instance'):
  43. Singleton._instance = Singleton(*args,**kwargs)
  44. return Singleton._instance
  45. def task(arg):
  46. obj = Singleton.instance()
  47. print(obj)
  48. for i in range(10):
  49. t = threading.Thread(target=task,args=[i,])
  50. t.start()
  51. """
  52. <__main__.Singleton object at 0x102265160>
  53. <__main__.Singleton object at 0x102265160>
  54. <__main__.Singleton object at 0x102265160>
  55. <__main__.Singleton object at 0x102265160>
  56. <__main__.Singleton object at 0x102265160>
  57. <__main__.Singleton object at 0x102265160>
  58. <__main__.Singleton object at 0x102265160>
  59. <__main__.Singleton object at 0x102265160>
  60. <__main__.Singleton object at 0x102265160>
  61. <__main__.Singleton object at 0x102265160>
  62. """

鸡鱼类的两种单例

第三种:__new__方法。

  1. ########################## 基于__new__方式实现 #########################
  2. import time
  3. import threading
  4. class Singleton(object):
  5. _instance_lock = threading.Lock()
  6.  
  7. def __init__(self):
  8. pass
  9.  
  10. def __new__(cls, *args, **kwargs):
  11. if not hasattr(Singleton, "_instance"):
  12. with Singleton._instance_lock:
  13. if not hasattr(Singleton, "_instance"):
  14. Singleton._instance = object.__new__(cls, *args, **kwargs)
  15. return Singleton._instance
  16.  
  17. # 单例模式,obj = Singleton() # 和基于类的单例相比,好在 这个实例化是正常实例化。
  18. # 示例
  19. obj1 = Singleton()
  20. obj2 = Singleton()
  21. print(obj1,obj2)

基于__new__实现单例

知识储备:元类相关(type & metaclass)

第四种:基于metaclass实现的单例

  1. import threading
  2. import time
  3. """
  4. class SingletonType(type):
  5. def __init__(self,*args,**kwargs):
  6. super(SingletonType, self).__init__(*args,**kwargs)
  7.  
  8. def __call__(cls, *args, **kwargs):
  9. obj = cls.__new__(cls,*args,**kwargs)
  10. cls.__init__(obj,*args,**kwargs)
  11. print(obj)
  12. return obj
  13.  
  14. class Foo(metaclass=SingletonType):
  15. def __init__(self,name):
  16. self.name = name
  17. def __new__(cls, *args, **kwargs):
  18. return object.__new__(cls)
  19.  
  20. obj = Foo('name')
  21. print(obj)
  22. """
  23.  
  24. import threading
  25. class SingletonType(type):
  26. _instance_lock = threading.Lock()
  27. def __call__(cls, *args, **kwargs):
  28. if not hasattr(cls,'_instance'):
  29. with SingletonType._instance_lock:
  30. if not hasattr(cls,'_instance'):
  31. cls._instance = super(SingletonType, cls).__call__(*args,**kwargs)
  32. return cls._instance
  33.  
  34. class Foo(metaclass=SingletonType):
  35. def __init__(self,arg):
  36. self.arg = arg
  37. obj1 = Foo(')
  38. obj2 = Foo(')
  39. print(obj1,obj2)
  40.  
  41. # <__main__.Foo object at 0x102240668> <__main__.Foo object at 0x102240668>

Flask_单例模式的更多相关文章

  1. C++实现线程安全的单例模式

    在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...

  2. 23种设计模式--单例模式-Singleton

    一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...

  3. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  4. java设计模式之--单例模式

    前言:最近看完<java多线程编程核心技术>一书后,对第六章的单例模式和多线程这章颇有兴趣,我知道我看完书还是记不住多少的,写篇博客记录自己所学的只是还是很有必要的,学习贵在坚持. 单例模 ...

  5. 设计模式C#合集--单例模式

    单例模式 代码: 第一种: private static Singleton singleton = null; private Singleton() { } public static Singl ...

  6. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

  7. GOF23设计模式之单例模式

    ·核心作用: -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. ·常见应用场景: -Windows的Task Manager(任务管理器)就是很典型的单例模式 -Windows的Recy ...

  8. GJM : C#设计模式(1)——单例模式

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  9. PHP设计模式(四)单例模式(Singleton For PHP)

    今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...

随机推荐

  1. ArcServer10.1系列产品之ArcGIS Web Adaptor (IIS)

    1.关于 ArcGIS Web Adaptor 通过 ArcGIS Web Adaptor,可以将 ArcGIS for Server 与您现有的 Web 服务器进行集成.ArcGIS Web Ada ...

  2. dstat参数选项

    Usage: dstat [-afv] [options..] [delay [count]]Versatile tool for generating system resource statist ...

  3. 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] ...

  4. Nuget~管理自己的包包

    很久很久以前,自己就想有个包包,最近又从网上淘了一个,价格不便宜呢,99块,还是个小腰包,不过作工还算精良,我喜欢的类型,帆布休闲包,可以将我的手机,耳机,水,小烟,小酒,小伞都放里,方便至极,哈哈!

  5. Update主循环的实现原理

    从写一段程序,到写一个app,写一个游戏,到底其中有什么不同呢?一段程序的执行时间很短,一个应用的执行时间很长,仅此而已.游戏中存在一个帧的概念. 这个概念大家都知道,类比的话,它就是电影胶卷的格.一 ...

  6. Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B "Or" Game (贪心)

    首先应该保证二进制最高位尽量高,而位数最高的数乘x以后位数任然是最高的,所以一定一个数是连续k次乘x. 当出现多个最高位的相同的数就枚举一下,先预处理一下前缀后缀即可. #include<bit ...

  7. 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 ...

  8. Vue中使用computed与watch结合实现数据变化监听

    目的:当数据变化时,为其中重要数据增加边框,实现闪烁以达到提醒目的.数据格式如下,只有在未处理火警/故障时增加闪烁边框.可以使用watch进行深度监听.数据格式已定,也非常明确要监听的数据是有两个.既 ...

  9. 香港城市大学:全球首创3D打印微型机器人技术 有望作治疗癌症用途

    香港城市大学(香港城大)的研究团队开发出了全球首创以磁力控制的3D打印微型机器人,该微型机器人技术能做到在生物体内精准运载细胞到指定的位置.新研发的微型机器人有望应用在治疗癌症的靶向治疗,并为细胞层面 ...

  10. 从输入url到页面加载完成发生了什么详解

    这是一道经典的面试题,这道题没有一个标准的答案,它涉及很多的知识点,面试官会通过这道题了解你对哪一方面的知识比较擅长,然后继续追问看看你的掌握程度.当然我写的这些也只是我的一些简单的理解,从前端的角度 ...