python singleton_python Singleton 模式

Singleton 模式,中文既为 单实例模式 。

一、代码示例

看一下普通的类:

class Normal(object):

_instance = []

config = ''

def set(self,value):

self.config = value

def get(self):

return self.confg

if __name__ == '__main__':

s1 = Normal()

s1.set('s1')

s2 = Normal()

s2.set('s2')

print id(s1)

print id(s2)

print s1.get()

print s2.get() 运行结果 :

ubuntu@yee:/tmp$ python t.py

139782948272976

139782948273040

s1

s2

可以看到,代码中生成了两个实例,每个实例都拥有自己的内存空间。

接下来看单实例的代码示例:

class Singleton(object):

_instance = []

config = ''

def __new__(cls,*args,**kwargs):

if not cls._instance:

cls._instance = super(Singleton,cls).__new__(cls,*args,**kwargs)

return cls._instance

def set(self,value):

self.config = value

def get(self):

return self.config

if __name__ == '__main__':

s1 = Singleton()

s1.set('config:s1')

s2 = Singleton()

s2.set('config:s2')

print id(s1)

print id(s2)

print s1.get()

print s2.get()

ubuntu@yee:/tmp$ python t.py

140275964136464

140275964136464

config:s2

config:s2 看到s2和s1 是同一个实例,所使用的都是同一个内存空间,所以 s1.set() 和s2.set()是设置了同一个变量 。

但是以上的代码也会有一个问题:线程安全

如果并发运行了两个线程,都检测到当前的  cls._instance = null ,那么都会创建新的线程,此时就全乱了。所以,我们需要加锁

#!/usr/bin/python

#-*- coding:utf8 -*-

import threading

import time

class Singleton(object):

_instance = []

config = ''

def __new__(cls,*args,**kwargs):

if not cls._instance:

print "I will lock thread"

mlock = threading.Lock()

mlock.acquire()

cls._instance = super(Singleton,cls).__new__(cls,*args,**kwargs)

mlock.release()

return cls._instance

def set(self,value):

self.config = value

def get(self):

return self.config

def execute():

s1 = Singleton()

print str(id(s1)) + "\n"

if __name__ == '__main__':

thread1 = threading.Thread(target=execute)

thread2 = threading.Thread(target=execute)

thread1.start()

thread2.start() 只有第一次创建实例的时候才会加锁,所以不用担心会影响性能 。

搞清楚了上面的代码之后,就可以总结出单实例的优点了:

节省内存空间

二、单实例的使用场景 :

比方说,

OS在开机之后,会维护一份用户的配置文件,这份文件 从开机到关机期间只需要有一份,并且常驻内存之中。这个时间就需要使用单实例。

单实例可以使系统不必在用户去修改某一项配置的时候重新new一个实例,单实例对象是全局的,常驻内存的,所以只需要直接赋值就可以了。

三、为什么需要避免使用单实例

请自行google : why singleton  bad

(使用百度的程序猿不是好程序猿)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值