在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__实现单例

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

第四种:基于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>

最新文章

  1. prolog 内部谓词
  2. hdu4939 Stupid Tower Defense (DP)
  3. Thinkpad 笔记本VMware Workstation 安装虚拟机出现&ldquo;此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态&rdquo;解决方法
  4. Windows下 使用CodeBlocks配置OpenGL开发环境
  5. 使用StarUML创建类图
  6. Android应用开发多语言drawable目录
  7. 1230.2——iOS准备(阅读开发者文档时的笔记)
  8. ceph理论及部署配置实践
  9. usaco1.1.1Your Ride Is Here(入门题)
  10. gulp3 和 gulp4 区别
  11. 前端工程化系列[04]-Grunt构建工具的使用进阶
  12. Django Rest framework 之 认证
  13. ARM总线架构
  14. Mininet安装
  15. LightOJ 1074 - Extended Traffic (SPFA)
  16. LED音乐频谱之输入数据处理
  17. ArcEngine和GDAL读写栅格数据机制对比(一)
  18. handsontable-developer guide-setting options,callback
  19. SublimeText 改变 tab的距离
  20. margin和spacing的区别

热门文章

  1. 大会聚焦 | 开源技术盛会LinuxCon首次来到中国,大咖齐聚关注业界动态
  2. HDU 2089 不要62 (数位DP,入门)
  3. LeetCode Happy Number 开心数字
  4. mvc的help和functions语法
  5. 【UML】用例图Use Case diagram(转)
  6. UVA11478 Halum (差分约束)
  7. netbackup如何手动获取主机ID证书。
  8. [numpy] 基础练习 (一)
  9. 解除phpMyAdmin导入大型MySQL数据库文件大小限制
  10. PAT (Basic Level) Practise (中文)- 1014. 福尔摩斯的约会 (20)