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

python 单例 多线程_python 单例模式

# 记录两种常用的单例模式

# 第一种

import threading

import time

class Singleton(object):

_instance = None

def __init__(self):

time.sleep(3)

@classmethod

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

if not cls._instance:

cls._instance = cls(*args, **kwargs)

return cls._instance

# 在多线程时会有问题

s1 = Singleton.instance()

s2 = Singleton.instance()

print(s1)

print(s2)

# 在多线程时,如果在__init__方法中存在IO操作,导致在对象创建过程中出现线程切换,单例模式就会失败。例如,在__init__中加入sleep,再使用多线程创建对象。

def create():

s = Singleton.instance()

print(s)

for i in range(10):

t = threading.Thread(target=create)

t.start()

# 输出结果如下:

<__main__.Singleton object at 0x0000022C12E65208>

<__main__.Singleton object at 0x0000022C12E65048>

<__main__.Singleton object at 0x0000022C12E653C8>

<__main__.Singleton object at 0x0000022C12E653C8>

<__main__.Singleton object at 0x0000022C12E653C8>

<__main__.Singleton object at 0x0000022C12E653C8>

<__main__.Singleton object at 0x0000022C12E653C8>

<__main__.Singleton object at 0x0000022C12E5AE48>

<__main__.Singleton object at 0x0000022C12E5AE48>

<__main__.Singleton object at 0x0000022C12E5A978>

# 解决办法加锁:

classSingleton(object):

_instance=None

_instance_lock=threading.Lock()def __init__(self):

time.sleep(3)

@classmethoddef instance(cls, *args, **kwargs):

cls._instance_lock.acquire()if notcls._instance:

cls._instance= cls(*args, **kwargs)

cls._instance_lock.release()return cls._instance

# 第二种:

# 在创建对象时,先执行__new__方法,因此在__new__方法中实现单例模式,这种方法的好处在于创建对象时和普通创建对象相同

class Singleton(object):

_instance = None

def __init__(self):

time.sleep(2)

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

if not cls._instance:

cls._instance = object.__new__(cls, *args, **kwargs)

return cls._instance

s1 = Singleton()

s2 = Singleton()

print(s1)

print(s2)

# 本来以为在使用多线程测试时,会出现和第一种方法相同的问题,但是,测试来看没有发现这个问题,所以也就没有加锁了。

相关文章:

  • echarts绘制大数量折线图导致浏览器崩溃_现代浏览器内部机制
  • filestream读取文件_ASP.NET Core WebAPI文件下载
  • python怎么循环合并数组_python数组循环合并python执行系统命令四种方法比较
  • git pull 强制覆盖本地_用git简单粗暴地完成本地、服务器同步
  • github可视化工具_深度学习训练过程可视化(附github源码)
  • grep 与条件_【125】Linux 中 ps ef|grep和ps、grep详解
  • linux搜索文件_学习+使用Linux的最佳姿势,收录近600条Linux系统命令
  • onblur事件怎么触发_JavaScript第十三章节 事件
  • html一个页面中切换多个页面_前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第2章HTML基础知识...
  • window.location.href 设置请求头_常见的http响应的返回头
  • java逆向工程_图书推荐安卓高级逆向工程师技能树
  • rangechecks 检测代码检测到超出范围的数组访问。_夯实基础系列(一)数据类型及其检测及进阶...
  • python示例程序演示_以Python代码实例展示kNN算法的实际运用
  • python 自动下载脚本_Python脚本自动下载小说
  • jdbc封装工具类代码_[22]-JDBC 工具类优化
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • canvas绘制圆角头像
  • Median of Two Sorted Arrays
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • RxJS: 简单入门
  • spring boot下thymeleaf全局静态变量配置
  • 百度地图API标注+时间轴组件
  • 普通函数和构造函数的区别
  • 前端之React实战:创建跨平台的项目架构
  • 前端之Sass/Scss实战笔记
  • 深入 Nginx 之配置篇
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 正则表达式
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #考研#计算机文化知识1(局域网及网络互联)
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (2.2w字)前端单元测试之Jest详解篇
  • (4)事件处理——(7)简单事件(Simple events)
  • (C语言)逆序输出字符串
  • (javascript)再说document.body.scrollTop的使用问题
  • (pojstep1.3.1)1017(构造法模拟)
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (全注解开发)学习Spring-MVC的第三天
  • (转)3D模板阴影原理
  • (转)关于pipe()的详细解析
  • (转)四层和七层负载均衡的区别
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .gitignore文件---让git自动忽略指定文件
  • .Net - 类的介绍
  • .Net Core 中间件验签
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /proc/stat文件详解(翻译)
  • ::before和::after 常见的用法
  • :中兴通讯为何成功
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @javax.ws.rs Webservice注解
  • @RequestBody与@ModelAttribute