zoukankan      html  css  js  c++  java
  • 多线程threading.local的作用及原理?

    1.示例代码

    import time
    import threading
    
    v = threading.local()
    
    def func(arg):
        # 内部会为当前线程创建一个空间用于存储:phone=自己的值
        v.phone = arg
        time.sleep(2)
        print(v.phone,arg) # 去当前线程自己空间取值
    
    for i in range(10):
        t =threading.Thread(target=func,args=(i,))
        t.start()
    

    2.原理

    import time
    import threading
    
    DATA_DICT = {}
    
    def func(arg):
        ident = threading.get_ident()
        DATA_DICT[ident] = arg
        time.sleep(1)
        print(DATA_DICT[ident],arg)
    
    
    for i in range(10):
        t =threading.Thread(target=func,args=(i,))
        t.start()
    

    3.拓展

    import time
    import threading
    
    INFO = {}
    
    
    class Local(object):
    
        def __getattr__(self, item):
            ident = threading.get_ident()
            return INFO[ident][item]
    
        def __setattr__(self, key, value):
            ident = threading.get_ident()
            if ident in INFO:
                INFO[ident][key] = value
            else:
                INFO[ident] = {key: value}
    
    # 实例化
    obj = Local()
    
    
    def func(arg):
        # 调用对象的 __setattr__方法(“phone”,1)
        obj.phone = arg
        time.sleep(2)
        print(obj.phone, arg)
    
    
    if __name__ == '__main__':
        for i in range(10):
            t = threading.Thread(target=func, args=(i,))
            t.start()
    

    总结:
    1.obj.x 调用方法__getattr__
    2.obj.x = 6 调用方法__setattr__

    4.作用

    内部自动为每个线程维护一个空间(字典),用于当前存取属于自己的值。保证线程之间的数据隔离。
    {
    线程ID: {...}
    线程ID: {...}
    线程ID: {...}
    线程ID: {...}
    }

  • 相关阅读:
    putty配置
    BroadcastReceiver应用详解 (转)
    linux主设备号和次设备号
    Enable screen lock and HOME key (eclair and older versions)(转)
    C#获取用户桌面等特殊系统路径
    java中Thread与Runnable的区别
    博文索引
    FlinkCDC实践
    关于libxml2.so.2不被Gstreamer链接的解决
    s.length什么意思
  • 原文地址:https://www.cnblogs.com/apollo1616/p/10350959.html
Copyright © 2011-2022 走看看