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: {...}
    }

  • 相关阅读:
    8.1 管道符| 使用技巧
    7.1 elementui的radio无法选中问题
    2.0 es6数组操作
    小练习-双数日期
    匿名函数、三元表达式、列表生成式
    sys.argv
    常用模块 os,sys,
    Python操作数据库
    Python time模块
    加密模块hashlib
  • 原文地址:https://www.cnblogs.com/apollo1616/p/10350959.html
Copyright © 2011-2022 走看看