python之路_flask框架_单例模式及session原理

实例化补充:

一、单例模式

1、单例模式介绍

  单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。常见有如下四种单例模式:

单例模式1:模块

  模块是天然的单例模式,因为在模块的第一次调用后会编译成.pyc文件,在以后的调用过程中会会直接加载.pyc文件。

单例模式2:类@classmethod

(1)无法支持多线程情况:

class Singleton(object):

    def __init__(self):
        #模拟io阻塞
        import time
        time.sleep(1)
    @classmethod
    def instance(cls,*args,**kwargs):
        if not hasattr(Singleton,"_instance"):
            Singleton._instance=Singleton(*args,**kwargs)
        return Singleton._instance
#应用
obj1=Singleton.instance()
obj2=Singleton.instance()
print(obj1,obj2)  #<__main__.Singleton object at 0x000002C49DB6C5F8> <__main__.Singleton object at 0x000002C49DB6C5F8>

(2)支持多线程情况

import threading
class Singleton(object):
    _instance_lock=threading.Lock()
    def __init__(self):
        import time
        time.sleep(1)

    @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(n):
    obj=Singleton.instance()
    print(n,obj)

for i in range(10):
    t=threading.Thread(target=task,args=[i,])
    t.start()

单例模式3:基于__new__

(1)不支持多线程情况

class Singleton(object):
    def __init__(self):
        pass
    def __new__(cls, *args, **kwargs):
        if not hasattr(Singleton,"_instance"):
            Singleton._instance=object.__new__(cls,*args,**kwargs)
        return Singleton._instance

#应用:类实例化时会首先去执行__new__方法
obj=Singleton()

(2)支持多线程情况

import threading
class Singleton(object):
    _instance_lock=threading.Lock()
    def __init__(self):
        import time
        time.sleep(1)
    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

#应用:类实例化时会首先去执行__new__方法
def task(n):
    obj=Singleton()
    print(n,obj)
for i in range(10):
    t=threading.Thread(target=task,args=[i,])
    t.start()

单例模式4:基于metaclass

  分析如下:

"""
1.对象是类创建,创建对象时候类的__init__方法自动执行,对象()执行类的 __call__ 方法
2.类是type创建,创建类时候type的__init__方法自动执行,类() 执行type的 __call__方法(类的__new__方法,类的__init__方法)

# 第0步: 执行type的 __init__ 方法【类是type的对象】
class Foo:
    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):
        pass

# 第1步: 执行type的 __call__ 方法
#        1.1  调用 Foo类(是type的对象)的 __new__方法,用于创建对象。
#        1.2  调用 Foo类(是type的对象)的 __init__方法,用于对对象初始化。
obj = Foo()
# 第2步:执行Food的__call__ 方法
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,name):
        self.name = name
obj1 = Foo(‘name‘)
obj2 = Foo(‘name‘)
print(obj1,obj2)

2、单例模式应用

  这里主要针对我们上一章节讲的数据库连接池,将其与单例模式进行结合,使得任何用户或者视图在调用数据库的时候,不需要反复实例化数据库连接池对象,主要介绍如下:

import pymysql
import threading
from DBUtils.PooledDB import PooledDB

class SingletonDBPool(object):
    _instance_lock = threading.Lock()

    def __init__(self):
        self.pool = PooledDB(
            creator=pymysql,
            maxconnections=6,
            mincached=2,
            maxcached=5,
            maxshared=3,
            blocking=True,
            maxusage=None,
            setsession=[],
            ping=0,
            host=‘127.0.0.1‘,
            port=3306,
            user=‘root‘,
            password=‘123‘,
            database=‘pooldb‘,
            charset=‘utf8‘
        )

    def __new__(cls, *args, **kwargs):
        if not hasattr(SingletonDBPool, "_instance"):
            with SingletonDBPool._instance_lock:
                if not hasattr(SingletonDBPool, "_instance"):
                    SingletonDBPool._instance = object.__new__(cls, *args, **kwargs)
        return SingletonDBPool._instance

    def connect(self):
        return self.pool.connection()

  上述数据库连接池的单例模块的引用的实例如下:

def run():
    pool = SingletonDBPool()               #实例化
    con = pool.connect()                   #创建连接
    # .........

    con.close()                            #关闭,不是真正的关闭

if __name__ == ‘__main__‘:
    run()

二、自定义session

  参考文档:https://python-team.gitbooks.io/flask-doc/content/di-si-zhang-kuo-zhan/11-nei-zhisession-yuan-li.html

原文地址:https://www.cnblogs.com/seven-007/p/8400091.html

时间: 2024-07-31 22:42:54

python之路_flask框架_单例模式及session原理的相关文章

python之路_flask框架_flask框架基础(2)

一.配置文件 和django不同的是,django会为我们提供配置好的setting文件,我们需要的配置都可以自动添加在setting文件中即可,但是flask不是这样,它是通过在内部为我们提供多种配置文件的接口,我们按照接口配置相关配置.简单介绍如下几种: 方式一: 如下,是我们入门告诉大家的配置方式,可以看出config本质上是一个字典(内部继承dict或者有__setitem__方法),通过给字典添加键值对的方式可以实现配置,但是像这种方式把大幅的配置代码写在主要程序代码中,显然不符合编程

python之路_flask框架_flask-session组件、信号及wtforms组件

一.flask-session组件 我们知道,在flask的内置session中,是存到加密cookie中.但是我们怎样么才可以将session在服务器也保存呢?之前我们也说过,自定义的session可以将键值对保存在内存中,但是想要实现在服务端永久的保存起来,我们就可以利用flask-session组件.利用此组件可以将session保存在redis.文件memcache等,如下列出主要的使用配置. 1.redis保存 from flask import Flask,session from

python之路第九编_线程和进程

进程.线程 进程:程序的一次执行 线程:CPU的基本调度单元 每一个进程提供需要执行程序的资源.一个进程有一个虚拟的地址空间,执行代码,开放的句柄系统对象,一个安全的情景感知,一个唯一的进程标识符,环境变量,一个优先级类,最小和最大的工作尺寸,至少有一个线程的执行,每一个进程以一个线程开始,叫做主线程,主线程可以创建多个子线程 进程是CPU一堆指令的集合,在单核CPU中,cpu一次只能执行一次任务.例如在一个工厂中,同一时间一个车间只能有一个车间可以工作,其他车间只能等待. 线程: 线程是CPU

Python之路66-Django中的Cookie和Session

目录 一.Cookie 二.Session 一.Cookie 1.获取Cookie  request.COOKIES["key"] request.get_signed_cookie(key, default=RAISE_ERROR, s, max_age=None) # 参数 # default:默认值 # salt:加密盐 # max_age:后台控制过期时间 2.设置Cookie rep = HttpResponse(...) 或 rep = render(request, ..

Python之路【第十八篇】:Web框架们

Python之路[第十八篇]:Web框架们 Python的WEB框架 Bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块. 1 2 3 4 pip install bottle easy_install bottle apt-get install python-bottle wget http://bottlepy.org/bottle.py Bottle框架大致可以分为以下部分: 路

Python之路【第十五篇】:Web框架

Python之路[第十五篇]:Web框架 Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/usr/bin/env python #coding:utf-8   import socket   def handle_request(client):     buf = client.recv(10

Python不归路_字符编码操作

文件操作补充 上篇随笔中写了文件操作的几个方法,其中truncate()方法遗漏,truncate()方法作用是截取内容,f.truncate()不带参数会清空文件内容,带参数表示截取从零到参数的位置 字符编码 在<Python不归路_零基础学习二>中我们已经学习了一些编码的知识,比如ASCII一共有255个符号,Unicode中,中文字符占两个字节,英文占一个字节,utf-8是unicode的优化方案,中文字节占三个字符.不同字符编码之间需要相互转化才能正常读取.encode和decode,

python之路,Day24 常用设计模式学习

python之路,Day24 常用设计模式学习 本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一

Python之路【第十七篇】:Django之【进阶篇】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')