线程锁在单例模式中的应用

yizhihongxing

多个线程在执行过程中会因为竞争同一个资源而产生线程冲突,造成死锁,从而引出线程锁这个概念

先拿到锁再执行业务操作:

当然我对这一块了解的还不透彻,只是了解在不加锁的多线程情况下,会破坏单例模式,所以就有了下面这一段

 1 import time
 2 import threading
 3 
 4 
 5 def decorator(func):
 6     lock = threading.Lock()
 7 
 8     def wrapper(*args, **kwargs):
 9         with lock:
10             func(*args, **kwargs)
11 
12     return wrapper
13 
14 
15 class Singleton(type):
16     def __init__(self, *args, **kwargs):
17         super(Singleton, self).__init__(*args, **kwargs)
18         self._instance = None
19 
20     @decorator
21     def __call__(self, *args, **kwargs):
22         if self._instance is None:
23             time.sleep(1)
24             self._instance = super(Singleton, self).__call__(*args, **kwargs)
25         return self._instance
26 
27 
28 class Valley(metaclass=Singleton):
29     ...
30 
31 
32 def create():
33     v = Valley()
34     print(id(v))
35 
36 
37 if __name__ == '__main__':
38     for i in range(5):
39         t = threading.Thread(target=create)
40         t.start()

output:

  140709207779456

  140709207779456

  140709207779456

  140709207779456

  140709207779456

 希望看到的人能多给我讲讲线程锁的应用场景,最后愿口罩下的我们、裁员下的我们,每天都有盼头

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:线程锁在单例模式中的应用 - Python技术站

(0)
上一篇 2023年4月2日 下午4:22
下一篇 2023年4月2日

相关文章

  • __call__用法简谈

      python一切皆对象,从是否可调用层面讲,对象又可以分为可调用对象、不可调用对象 在本篇中,类中实现__call__双下方法,即将该类的实例变为可调用对象   普通类未实现__call__的方法,实例是不可调用的,先看 1 class Valley: 2 … 3 4 5 if __name__ == ‘__main__’: 6 v = Valley…

    Python开发 2023年4月2日
    00
  • 浅用描述符

      可以理解为property方法的一种进阶,都可以用来创建一种新形式的实例属性,即在实例属性值的获取和设定上,增加额外的处理事务,such as:类型检查、验证   重写三个属性访问方法,其中__delete__方法是否重写取决需求   在类层次上引用描述符,即该类遵从描述符协议 1 class Check: 2 def __init__(self, na…

    Python开发 2023年4月2日
    00
  • 泛型

    第一个参数类型决定执行特定的方法体 一、单分派泛函数   只对函数的第一个参数做类型检查,发现局限性太大,没什么特别的应用场景,也可能是我没用到 1 from functools import singledispatch 2 3 4 @singledispatch 5 def func(a, *args): 6 raise TypeError(“暂不支持{…

    Python开发 2023年4月2日
    00
  • 抽象类的子类化机制

    抽象类:可以作为顶层基类,从高层次规范编程接口 1、在abc模块中,最常见的抽象类有Iterable,我们可以用他判断一个对象是不是可迭代对象 1 from collections.abc import Iterable 2 3 4 class Valley: 5 6 def __iter__(self): 7 … 8 9 10 if __name__ …

    Python开发 2023年4月2日
    00
  • 派生类中扩展属性

    对于在父类中存在的属性,如果要在其派生类中继续扩展属性   可以这样实现 1 class Valley: 2 def __init__(self): 3 self._name = None 4 5 @property 6 def name(self): 7 return self._name 8 9 @name.setter 10 def name(self…

    Python开发 2023年4月2日
    00
  • 比较赋值、浅拷贝、深拷贝

    1、无论是浅拷贝还是深拷贝,拷贝对象后是否会开辟新内存,取决于被拷贝对象的数据类型是否可变,一般来讲,可变的数据类型会开辟新内存,不可变数据类型反之不会开辟新内存,进行内存地址的引用(-5-256以外的大整数池会开辟内存,注:但我本地进行测试比较内存还是一样的,有问题) 2、要在单层、嵌套型对象中逐一比较拷贝 3、浅拷贝和深拷贝的区别主要体现在对嵌套型结构的…

    Python开发 2023年4月2日
    00
  • 循环优化一

    主角:takewhile   判断序列中元素是否为偶数,奇数则终止 这是我们最常用的一种方式,其实没必要这么复杂 1 a = [4, 6, 7, 3] 2 3 4 def judge_is_even(item): 5 if item % 2 == 0: 6 return True 7 return False 8 9 10 # 最常用 11 for item…

    Python开发 2023年4月2日
    00
  • __slots__

      在类的层次上定义时,python给实例采用一种更加紧凑的内部表示来管理属性,而非字典,这样,我们只被允许访问__slots__内部的属性   这样定义会带来两点好处,然后具体的实践我在工作中目前运用的还很少,后面如果发现还有什么坑,我再来补充 1、创建大量实例时节省内存 2、访问属性快 1 class Valley: 2 __slots__ = “nam…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部