python 单例模式 redis_Python设计模式——单例模式

本文介绍了Python中的单例模式,用于确保在单个进程中只有一个类的实例,以实现数据共享和减少系统开销。然而,在多进程的web应用如Django中,单例模式无法实现数据共享,此时可以通过进程间通信或使用Redis等nosql数据库来达成目的。文中提供了两种Python实现单例模式的方法,并指出了潜在的问题和解决思路。
摘要由CSDN通过智能技术生成

单例模式是日常应用中最广泛的模式了,其目的就是令到单个进程中只存在一个类的实例,从而可以实现数据的共享,节省系统开销,防止io阻塞等等

但是在多进程的应用中,单例模式就实现不了了,例如一些web应用,django,这些,因为会启动多条进程来监听http请求,这样的会通过单例模式是实现不了数据共享的,也就是实现不了单例模式的目的了,这时需要用进程间通信方法来实现数据共享,当然也可以尝试使用redis这些nosql数据库实现数据共享,因为它们的读取数据较快。

#encoding=utf-8

__author__ = 'kevinlu1010@qq.com'

classSingleton(object):def __new__(cls, *args, **kwargs):if not hasattr(cls,'_the_instance'):

cls._the_instance=object.__new__(cls,*args, **kwargs)returncls._the_instanceclassA(Singleton):print 'init before'

def __init__(self):print 'i am __init__'

deff(self):print 'i am f'a=A()

b=A()

a.f()print 'done'

这里写了个Singleton的类,通过重新__new__方法,可以查找当前进程有没有该类的实例,如果有就返回该实例,如果没有就新建一个

实例化两次A类(实际只实例化了一次)'init before'只会print一次,但是'i am __init__'是会print两次的,所以不想重复执行的代码要放在’init before‘的位置

这种实现方法有三个问题

1.并发的时候会有问题,这个可以通过在__new__中价格锁了解决

2.如果子类需要重新__new__函数,那就麻烦了

3.__init__函数会被调用多次

由于模块是线程安全的,而且一个模块只会被实例化一次,所以可以通过模块来实现单例

singleton.py

#encoding=utf-8

__author__ = 'kevinlu1010@qq.com'num=0defprint_num():print num

main.py

#encoding=utf-8

__author__ = 'kevinlu1010@qq.com'

importsingletonprintsingleton.num

singleton.num+= 1singleton.print_num()

如果这样没有类的特性,可以这样:

singleton.py

#encoding=utf-8

__author__ = 'kevinlu1010@qq.com'

classA():print 'init before'num=0def __init__(self):print 'i am __init__'

deff(self):print 'i am f'a=A()

main.py

#encoding=utf-8

__author__ = 'kevinlu1010@qq.com'

importsingleton

a=singleton.aprint a.f()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值