一个实例教你怎么在Python多线程下保持单列模式

先描述在python中的一个场景,我有个自定义的类,实例了一些transfer信息传递及线程池的作用,然后还需要被用来共享一些服务配置。 这时候稍不注意会出现一批新的类实例被创建。 这样造成了数据不能共享,浪费资源。 我知道大家也不想这样,但往往不注意就这样了。 肿么办? 可以直接上单例模式!

那么什么是单例模式?

简单说单例模式可以保证一个类仅有一个实例, 并提供一个访问它的全局访问点——《设计模式》, 再废话一句,单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

- 特点

– 单例类只能有一个实例或给定数目的单例

– 单例类必须给所有其他对象提供这个实例

- 优点

– 避免对资源的多重占用,避免对同一个资源文件的同时操作,造成文件状态不一致

– 减少内存开支,尤其是需要频繁创建和使用的类

– 设置全局访问点,优化和共享资源访问

- 场景

– 减少在协同开发中产生类似的实例对象,节省资源

– 整个项目中需要一个共享访问带点或共享数据

这里不相信讲解代码了,实现很是简单,借用类变量做个标记,首先使用__new__创建实例对象。 如果你再次创建一个实例对象的时候,首先会在cls.instance判断是否已经创建过实例对象.这样就能防止实例被多次创建。 多线程的环境实现起来也简单,加了一个threading lock同步锁而已。

这样我们确实是解决了多线程数据安全的问题。但是这时候如其它线程要获得Singleton实例的线程还是必须等待,锁的存在降低了效率,有性能损耗。

总结, 我自己会有选择性的使用单例模式,把单例模式封装成一个装饰器使用起来很方便。另外对于数据库,尤其是mysql,建议不要使用单例模式。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180312A0G4UD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券