zoukankan      html  css  js  c++  java
  • threding.local

    作用:为每一个线程开辟一个独立的内存空间

    示例

    from threading import Thread, local
    import time
    
    obj = local()
    
    
    def test(i):
        obj.xx = i
        time.sleep(2)
        print(obj.xx, i)
    
    
    for i in range(10):
        t = Thread(target=test, args=(i, ))
        t.start()

    实现原理

    from threading import Thread
    import threading
    import time
    
    #
    dic = {}
    
    
    def test(i):
        index = threading.get_ident()
        if index in dic:
            dic[index]['xx'] = i
        else:
            dic[index] = {'xx': i}
        time.sleep(1)
        print(dic[index]['xx'], i)
    
    
    for i in range(10):
        t = Thread(target=test, args=(i, ))
        t.start()

    改良

    import threading
    import time
    import greenlet
    
    try:
        get_ident = greenlet.getcurrent
    except Exception as e:
        get_ident = threading.get_ident
    
    
    class Local:
        dic = {}
    
        def __getattr__(self, item):
            index = get_ident()
            if index in self.dic:
                return self.dic[index][item]
            else:
                return None
    
        def __setattr__(self, key, value):
            index = get_ident()
            if index in self.dic:
                self.dic[index][key] = value
            else:
                self.dic[index] = {key: value}
    
    
    obj = Local()
    
    
    def test(a):
        obj.xx = a
        time.sleep(2)
        print(obj.xx, a)
    
    
    for i in range(10):
        t = threading.Thread(target=test, args=(i, ))
        t.start()
  • 相关阅读:
    内存对齐
    类和对象
    C++ 各种继承方式的类内存布局
    静态变量static
    程序内存布局
    String类
    C++与C的区别
    命名空间
    C
    D
  • 原文地址:https://www.cnblogs.com/wt7018/p/11603467.html
Copyright © 2011-2022 走看看