当前位置: 首页 > news >正文

node.js做的网站wordpress视频网站主题

node.js做的网站,wordpress视频网站主题,十大电子元器件采购商城,邯郸网站建设浩森宇特单例模式#xff08;Singleton Pattern#xff09; 是一种常用的软件设计模式#xff0c;该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中#xff0c;某个类只能出现一个实例时#xff0c;单例对象就能派上用场。 比如#xff0c;某个服务器程序的…单例模式Singleton Pattern 是一种常用的软件设计模式该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中某个类只能出现一个实例时单例对象就能派上用场。 比如某个服务器程序的配置信息存放在一个文件中客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间有很多地方都需要使用配置文件的内容也就是说很多地方都需要创建 AppConfig 对象的实例这就导致系统中存在多个 AppConfig 的实例对象而这样会严重浪费内存资源尤其是在配置文件内容很多的情况下。微信搜索公众号架构师指南回复架构师 领取资料 。 事实上类似 AppConfig 这样的类我们希望在程序运行期间只存在一个实例对象。 在 Python 中我们可以用多种方法来实现单例模式 使用模块 使用装饰器 使用类 基于 __new__ 方法实现 基于 metaclass 方式实现 下面来详细介绍 使用模块 其实Python 的模块就是天然的单例模式因为模块在第一次导入时会生成 .pyc 文件当第二次导入时就会直接加载 .pyc 文件而不会再次执行模块代码。 因此我们只需把相关的函数和数据定义在一个模块中就可以获得一个单例对象了。 如果我们真的想要一个单例类可以考虑这样做 class Singleton(object):def foo(self):pass singleton Singleton() 将上面的代码保存在文件 mysingleton.py 中要使用时直接在其他文件中导入此文件中的对象这个对象即是单例模式的对象  from mysingleton import singleton 使用装饰器  def Singleton(cls):_instance {}def _singleton(*args, **kargs):if cls not in _instance:_instance[cls] cls(*args, **kargs)return _instance[cls]return _singletonSingleton class A(object):a 1def __init__(self, x0):self.x xa1 A(2) a2 A(3) 使用类  class Singleton(object):def __init__(self):passclassmethoddef instance(cls, *args, **kwargs):if not hasattr(Singleton, _instance):Singleton._instance Singleton(*args, **kwargs)return Singleton._instance 一般情况大家以为这样就完成了单例模式但是当使用多线程时会存在问题 class Singleton(object):def __init__(self):passclassmethoddef instance(cls, *args, **kwargs):if not hasattr(Singleton, _instance):Singleton._instance Singleton(*args, **kwargs)return Singleton._instanceimport threadingdef task(arg):obj Singleton.instance()print(obj)for i in range(10):t threading.Thread(targettask,args[i,])t.start() 程序执行后打印结果如下 __main__.Singleton object at 0x02C933D0 __main__.Singleton object at 0x02C933D0 __main__.Singleton object at 0x02C933D0 __main__.Singleton object at 0x02C933D0 __main__.Singleton object at 0x02C933D0 __main__.Singleton object at 0x02C933D0 __main__.Singleton object at 0x02C933D0 __main__.Singleton object at 0x02C933D0 __main__.Singleton object at 0x02C933D0 __main__.Singleton object at 0x02C933D0 看起来也没有问题那是因为执行速度过快如果在 __init__ 方法中有一些 IO 操作就会发现问题了。 下面我们通过 time.sleep 模拟我们在上面 __init__ 方法中加入以下代码 def __init__(self):import timetime.sleep(1) 重新执行程序后结果如下 __main__.Singleton object at 0x034A3410 __main__.Singleton object at 0x034BB990 __main__.Singleton object at 0x034BB910 __main__.Singleton object at 0x034ADED0 __main__.Singleton object at 0x034E6BD0 __main__.Singleton object at 0x034E6C10 __main__.Singleton object at 0x034E6B90 __main__.Singleton object at 0x034BBA30 __main__.Singleton object at 0x034F6B90 __main__.Singleton object at 0x034E6A90 问题出现了按照以上方式创建的单例无法支持多线程。 解决办法加锁未加锁部分并发执行加锁部分串行执行速度降低但是保证了数据安全。 import time import threadingclass Singleton(object):_instance_lock threading.Lock()def __init__(self):time.sleep(1)classmethoddef instance(cls, *args, **kwargs):with Singleton._instance_lock:if not hasattr(Singleton, _instance):Singleton._instance Singleton(*args, **kwargs)return Singleton._instancedef task(arg):obj Singleton.instance()print(obj)for i in range(10):t threading.Thread(targettask,args[i,])t.start()time.sleep(20) obj Singleton.instance() print(obj) 打印结果如下 __main__.Singleton object at 0x02D6B110 __main__.Singleton object at 0x02D6B110 __main__.Singleton object at 0x02D6B110 __main__.Singleton object at 0x02D6B110 __main__.Singleton object at 0x02D6B110 __main__.Singleton object at 0x02D6B110 __main__.Singleton object at 0x02D6B110 __main__.Singleton object at 0x02D6B110 __main__.Singleton object at 0x02D6B110 __main__.Singleton object at 0x02D6B110 这样就差不多了但是还是有一点小问题就是当程序执行时执行了 time.sleep(20) 后下面实例化对象时此时已经是单例模式了。 但我们还是加了锁这样不太好再进行一些优化把 intance 方法改成下面这样就行 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 这样一个可以支持多线程的单例模式就完成了。  import time import threadingclass Singleton(object):_instance_lock threading.Lock()def __init__(self):time.sleep(1)classmethoddef 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._instancedef task(arg):obj Singleton.instance()print(obj)for i in range(10):t threading.Thread(targettask,args[i,])t.start()time.sleep(20) obj Singleton.instance() print(obj) 这种方式实现的单例模式使用时会有限制以后实例化必须通过 obj Singleton.instance() 如果用 obj Singleton()这种方式得到的不是单例。 基于 __new__ 方法实现 通过上面例子我们可以知道当我们实现单例时为了保证线程安全需要在内部加入锁。 我们知道当我们实例化一个对象时是先执行了类的 __new__ 方法我们没写时默认调用 object.__new__实例化对象然后再执行类的 __init__ 方法对这个对象进行初始化所有我们可以基于这个实现单例模式。 import threadingclass Singleton(object):_instance_lock threading.Lock()def __init__(self):passdef __new__(cls, *args, **kwargs):if not hasattr(Singleton, _instance):with Singleton._instance_lock:if not hasattr(Singleton, _instance):Singleton._instance object.__new__(cls) return Singleton._instanceobj1 Singleton() obj2 Singleton() print(obj1,obj2)def task(arg):obj Singleton()print(obj)for i in range(10):t threading.Thread(targettask,args[i,])t.start() 打印结果如下 __main__.Singleton object at 0x038B33D0 __main__.Singleton object at 0x038B33D0 __main__.Singleton object at 0x038B33D0 __main__.Singleton object at 0x038B33D0 __main__.Singleton object at 0x038B33D0 __main__.Singleton object at 0x038B33D0 __main__.Singleton object at 0x038B33D0 __main__.Singleton object at 0x038B33D0 __main__.Singleton object at 0x038B33D0 __main__.Singleton object at 0x038B33D0 __main__.Singleton object at 0x038B33D0 __main__.Singleton object at 0x038B33D0 采用这种方式的单例模式以后实例化对象时和平时实例化对象的方法一样 obj Singleton() 。另外搜索公众号GitHub猿后台回复“赚钱”获取一份惊喜礼包。 基于 metaclass 方式实现 相关知识: 类由 type 创建创建类时type 的 __init__ 方法自动执行类() 执行 type 的 __call__ 方法(类的 __new__ 方法类的 __init__ 方法) 对象由类创建创建对象时类的 __init__ 方法自动执行对象()执行类的 __call__ 方法 例子 class Foo:def __init__(self):passdef __call__(self, *args, **kwargs):passobj Foo() # 执行type的 __call__ 方法调用 Foo类是type的对象的 __new__方法用于创建对象然后调用 Foo类是type的对象的 __init__方法用于对对象初始化。obj() # 执行Foo的 __call__ 方法 元类的使用 class SingletonType(type):def __init__(self,*args,**kwargs):super(SingletonType,self).__init__(*args,**kwargs)def __call__(cls, *args, **kwargs): # 这里的cls即Foo类print(cls,cls)obj cls.__new__(cls,*args, **kwargs)cls.__init__(obj,*args, **kwargs) # Foo.__init__(obj)return objclass Foo(metaclassSingletonType): # 指定创建Foo的type为SingletonTypedef __init__(selfname):self.name namedef __new__(cls, *args, **kwargs):return object.__new__(cls)obj Foo(xx) 实现单例模式 import threadingclass 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._instanceclass Foo(metaclassSingletonType):def __init__(self,name):self.name nameobj1 Foo(name) obj2 Foo(name) print(obj1,obj2)
http://www.zqtcl.cn/news/796367/

相关文章:

  • 建设部网站 注册违规北京梵客装饰
  • 大连制作网站报价网站网站怎么做代理
  • php做网站如何架构品牌vi设计欣赏
  • 网站外链建设与文章发布规范网址例子
  • 外贸网站空间选择商业计划书
  • 手机作图软件app专业做邯郸网站优化
  • 济南网站定制制作wordpress theid
  • 企业网站建设能解决什么问题设计房子需要多少钱
  • 专业网站开发制作石家庄信息门户网站定制
  • 藤虎网络广州网站建设网站域名实名认证官网
  • 佛山专业网站建设公司推荐it行业做网站一个月多少钱
  • 三网合一网站怎么做苏醒主题做的网站
  • wordpress站内统计插件wordpress模板 单栏
  • 龙岩网站定制网站开发 技术路线
  • 广州制作网站开发网站标题怎么设置
  • 海南旅游网站开发背景做网站兼容ie
  • 查找人网站 优帮云本地升级wordpress
  • 安庆什么网站好小事做wordpress主题vue
  • 高端商品网站网络运维工程师面试题及答案
  • 做网站的dw全称是啥适合迷茫年轻人的工作
  • 免费软件库合集软件资料网站wordpress go链接跳转错误
  • 重庆那里做网站外包好和镜像网站做友链
  • 网站栏目关键词装修效果图制作软件
  • 企业网站开发公司-北京公司北京医疗网站建设公司
  • 可以做配音兼职的网站产品网站怎样做外部链接
  • 如何制作网站效果图做外单要上什么网站
  • 网站开发预算编制网站可以制作ios
  • 强化网站建设网页翻译怎么弄出来
  • 长春火车站到龙嘉机场高铁时刻表视频网站建设公司排名
  • 武进网站建设代理商google官网下载