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)
今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...
随机推荐
- 帝国empirecms后台登陆次数限制修改
打开文件:\e\config\config.php, 找到 'loginnum'=>5, 把5改为自己想要的数字即可
- Ubuntu11.04 安装cuda4.3
一.卸载官方驱动并安装显卡驱动 1. sudo gedit /etc/modprobe.d/blacklist.conf,在文件末尾加上如下五行,然后保存 blacklist vga16fb blac ...
- Viewcontroller基类
#import <UIKit/UIKit.h> #import "YQZMutableArray.h" @interface YQZViewController : U ...
- SharePoint 2013 安装配置(2)
上一篇中,我们已经安装了Windows Server 2012 R2.现在第二部分,如何在Windows Server 2012 R2中安装Active Directory域控制器.请按照以下步骤. ...
- tpcc-mysql 实践
一.TPCC 介绍 TPC:全称Transaction Processing Performance Council (事务处理性能委员会),是一家非盈利性组织,该组织制定各种商业应用的基准测试规范, ...
- 掉坑日志:Windows Native API与DPI缩放
高DPI显示器越来越普及,软件自然也要适应这个变化,最近实习的时候也遇到了一个关于DPI缩放的问题.因为内部框架的一个控件有BUG,会导致内容的显示出问题,后来实在没办法改成了用Windows Nat ...
- The expected type was 'System.Int64' but the actual value was null.”
System.InvalidOperationException:“An exception occurred while reading a database value for property ...
- Js笔记-第11课
// 第11课 作用域精解 运行期上下文,当函数执行时,会创建一个成为执行期上下文的内部对象.一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行期上下文都是独 ...
- atomic nonatomic区别
摘要 atomic和nonatomic区别用来决定编译器生成的getter和setter是否为原子操作.atomic提供多线程安全,是描述该变量是否支持多线程的同步访问,如果选择了atomic 那么就 ...
- Boo who-freecodecamp算法题目
Boo who 1.要求 检查一个值是否是基本布尔类型,并返回 true 或 false. 基本布尔类型即 true 和 false 2.思路 利用switch语句判断输入的数据是true/false ...