首页 > 编程语言 >python单例模式处理多线程问题

python单例模式处理多线程问题

时间:2023-03-08 18:34:26浏览次数:38  
标签:__ name python instance 单例 多线程 cls


# 单例模式处理多线程的问题
import threading
import time


class Single:
instance = None

def __init__(self, name):
self.name = name

def __new__(cls, *args, **kwargs):
if not cls.instance:
time.sleep(0.1)
cls.instance = object.__new__(cls)
return cls.instance


def dotask():
obj = Single("test")
print(obj)


for i in range(10):
t = threading.Thread(target=dotask)
t.start()
# 在使用多线程的情况下。输出id不同,说明此单例模式是存在问题的:
'''

<__main__.Single object at 0x000002C16CEA67C0><__main__.Single object at 0x000002C16CEA6850>
<__main__.Single object at 0x000002C16CEA1DC0>
<__main__.Single object at 0x000002C16CEA1640><__main__.Single object at 0x000002C16CEA1F10>
<__main__.Single object at 0x000002C16CEA18B0>
<__main__.Single object at 0x000002C16CEA1400>
<__main__.Single object at 0x000002C16CEA1670>

<__main__.Single object at 0x000002C16CEA1640>

<__main__.Single object at 0x000002C16CE9CF10>
'''
# 要解决多线程的单例模式,需要添加锁来处理
import threading
import time



class Single2:
instance = None
lock = threading.RLock()

def __init__(self, name):
self.name = name

def __new__(cls, *args, **kwargs):
with cls.lock:
if not cls.instance:
time.sleep(0.1)
cls.instance = object.__new__(cls)
return cls.instance


def dotask():
obj = Single2("test")
print(obj)


for i in range(10):
t = threading.Thread(target=dotask)
t.start()

# 此时输出就完全一致了:
'''
<__main__.Single2 object at 0x00000204B9A30C70><__main__.Single2 object at 0x00000204B9A30C70>

<__main__.Single2 object at 0x00000204B9A30C70>
<__main__.Single2 object at 0x00000204B9A30C70>
<__main__.Single2 object at 0x00000204B9A30C70>
<__main__.Single2 object at 0x00000204B9A30C70>
<__main__.Single2 object at 0x00000204B9A30C70>
<__main__.Single2 object at 0x00000204B9A30C70><__main__.Single2 object at 0x00000204B9A30C70><__main__.Single2 object at 0x00000204B9A30C70>

'''

标签:__,name,python,instance,单例,多线程,cls
From: https://www.cnblogs.com/dyjnicole/p/17195696.html

相关文章

  • python FastAPI sqlalchemy 数据库模型基类通用模型
    作用用于所有表都需要使用的字段或者方法实现代码base.py#!/usr/bin/python#-*-coding:utf-8-*-#@time:2023/2/1317:43#@author:pugongying#@de......
  • python 通过API操作阿里云oss
    catpython_oss.py#!/usr/bin/python#-*-coding:utf-8-*-#@time:2023/2/2314:29#@author:pugongying#@description:#pipinstallalibabacloud_os......
  • python 生成器
    生成器生成器是用来生成数据的一个办法yield关键字yield相当于是return,当函数运行到这里之后会暂停,并且返回后面的变量给调用的位置yield是没有返回值的,所以num=yie......
  • 在使用vue2项目中运行 npm install gyp verb check python checking for Python execu
    这个错误是因为在运行npminstall命令时,需要安装某些Node.js模块的本机代码(NativeCode)并编译它们,而这些模块的编译需要使用Python2。解决这个问题的方法是:确认你......
  • python创建线程传参误区记录
    创建线程可以使用threading模块中的Thread方法;其中Thread方法允许的参数如下:(self,group=None,target=None,name=None,args=(),kwargs=None,*,daemon=None)这个构......
  • python基础
    1、type()语句 通过type()语句来得到数据的类型,能查看变量中存储的数据类型。 查看的是:变量储存的数据的类型。因为,变量无类型,但是它存储的数据有。 语法:type(被查......
  • 【流畅的Python0101】Python数据模型
    1.特殊方法示例:一摞Python风格的纸牌importcollectionsCard=collections.namedtuple('Card',['rank','suit'])classFrenchDeck:#Python2中要写成FrenchDeck(......
  • python学习-第三方库综合程序设计实验报告
    目录实验四: Python综合程序设计实验名称:Python综合程序设计              指导教师:      实验日期:2022年 12 月 5 日......
  • linux检测程序运行时间和内存峰值 Python脚本
    #!/usr/bin/envpython3#-*-encoding:utf-8-*-importsubprocessasspimportsysimporttimedefget_mem(pid):c=sp.Popen(['ps','-aux'],stdout=sp......
  • Python学习笔记:str.zfill补全位数
    一、介绍zfill函数用于在字符串的开头添加零,直到达到指定的长度。如果len参数的值小于字符串的长度,则不执行填充。具体使用语法为:str.zfill(len)如果是整型、浮点......