首页 / 知识
Python实现线程安全的单例模式
2023-11-12 13:37:00
单例模式是一种常见的设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
比如,服务器的配置信息写在一个文件中online.conf中,客户端通过一个Config的类来读取配置文件的内容。如果在程序运行期间,有很多地方都需要使用配置文件的内容,那么每个调用配置文件的地方都会创建Config的实例,这就导致系统中存在多个Config的实例对象,在配置文件内容很多的情况下,我们就浪费了大量的内存做了同样的事。事实上,对于Config类我们在程序运行期间时只需要一个实例对象即可,这时单例模式就是最好的选择。
python的模块就是天然的单例模式,这里我们使用修饰器来实现单例模式,以下是代码实现
defSingleton(cls):
instances={}
defget_instance(*args,**kw):
ifclsnotininstances:
instances[cls]=cls(*args,**kw)
returninstances[cls]
returnget_instance
代码也很简单,将类传入单例修饰器中,如果该类还未生成实例(instances中不存在该类),那么就生成一个新的实例返回,并记录在instances中。如果已经instances中已经存在该类,那么直接返回实例instances[cls]。
那么这段代码是完美的吗?答案是否定的,这段代码不是线程安全的。要实现线程安全需要配合锁的使用,只有占有锁的线程才能继续访问单例实例,看来我们需要再写一个修饰器来实现线程安全了,以下是完整的代码实现和简单的多线程测试用例。
#!/usr/bin/python
#-*-coding:utf-8-*-
importthreading
defsynchronized(func):
func.__lock__=threading.Lock()
defsynced_func(*args,**kws):
withfunc.__lock__:
returnfunc(*args,**kws)
returnsynced_func
defSingleton(cls):
instances={}
@synchronized
defget_instance(*args,**kw):
ifclsnotininstances:
instances[cls]=cls(*args,**kw)
returninstances[cls]
returnget_instance
defworker():
single_test=test()
print"id---->%s"%id(single_test)
@Singleton
classtest():
a=1
if__name__=="__main__":
task_list=[]
foroneinrange(30):
t=threading.Thread(target=worker)
task_list.append(t)
foroneintask_list:
one.start()
foroneintask_list:
one.join()
以上内容为大家介绍了Python实现线程安全的单例模式,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
如何杀死一个Python线程
如何杀死一个Python线程,状态,线程,代码,标准,意外,工作,控制权,培训,事件,结束,我经常被问到如何杀死一个后台线程,这个问题的答案让很多人不Python 3.6 中针对文件系统的神奇
Python 3.6 中针对文件系统的神奇方法,数字,代码,数据,标准,信息,培训,首次,工作,文件名,常数,Python3.6首次发布于2016年,尽管它已经发布了很为何你的Python代码应是扁平与稀疏
为何你的Python代码应是扁平与稀疏的,代码,培训,信息,观察,设计,工具,嵌套,闻闻,程序员,沉思,Python之禅之所以得名,正是由于它那简明扼要的规如何提速优化python代码?
如何提速优化python代码?,代码,时间,数据,新增,写法,包装,情况,下来,面临,工作,Python是一种脚本语言,相比C/C++这样的编译语言,在效率和性能方python经典最短代码实现排序的功能
python经典最短代码实现排序的功能,代码,位置,数据,分析,时间,序列,元素,培训,下来,算法,冒泡排序:算法思想:1.比较相邻的元素,如果第一个比第二Python编程中的反模式
Python编程中的反模式,代码,时间,活跃,部门,标准,培训,模式,复杂度,初学者,错误,python是时下最热门的编程语言之一了。简洁而富有表达力的语Python学习之进程和线程
Python学习之进程和线程,代码,平台,系统,线程,进程,标准,数据,服务,培训,管理,对于操作系统来说,一个任务就是一个进程(Process),比如打开一个如何让Python代码更易维护
如何让Python代码更易维护,代码,项目,标准,工具,质量,地方,一致,更正,培训,控制权,检查你的代码的质量,通过这些外部库使其更易维护。可读性很Python线程编程的两种方式
Python线程编程的两种方式,代码,包装,线程,培训,函数,对象,模块,参数,方式,方法,Python中如果要使用线程的话,python的lib中提供了两种方式。python文件打开模式
python文件打开模式,观点,数据,文件,权威,管理,系统,名称,资料,培训,模式,我们先来看下在Python、PHP和C语言中打开文件的函数定义Python#PytPython 多线程死锁问题的巧妙解决
Python 多线程死锁问题的巧妙解决方法,异常,持有,代码,情况,信息,管理,数据,包装,策略,预期,死锁死锁的原理非常简单,用一句话就可以描述完。python 报错信息汇总
python 报错信息汇总,信息,情况,名字,培训,名称,字符,参数,原因,文件,样式,1.UserWarning:DataValidationextendionisnotsupportedandwillber