• flask 源码专题(七):threading.local和高级


    1.python之threading.local

    • 当每个线程在执行 val.num=1 ,在内部会为此线程开辟一个空间,来存储 num=1

    • val.num,找到此线程自己的内存地址去取自己存储 num

    import time
    import threading
    
    val1 = threading.local()
    
    def task(i):
        val.num = i
        time.sleep(1)
        print(val.num)
    
    for i in range(4):
        t = threading.Thread(target=task,args=(i,))
        t.start()

    2. 线程唯一标识

      get_ident

    import threading
    from threading import get_ident
    
    def task():
        ident = get_ident()
        print(ident)
    for i in range(20):
        t = threading.Thread(target=task)
        t.start()

    3. 自定义threading.local

    储存结构:

    storage = {
    1112:{'x1':1}
    1113:{'x1':2}
    1114:{'x1':3}
    1115:{'x1':4}
    }

    import threading
    class Local(object):
        def __init__(self):
            object.__setattr__(self,'storage',{})
    
        def __setattr__(self, key, value):
            ident = threading.get_ident()
            if ident in self.storage:
                self.storage[ident][key] = value
            else:
                self.storage[ident] = {key:value}
    
        def __getattr__(self, item):
            ident = threading.get_ident()
            if ident not in self.storage:
                return
            return self.storage[ident].get(item)
    
    local = Local()
    
    def task(arg):
        local.x1 = arg
        print(local.x1)
    
    for i in range(5):
        t = threading.Thread(target=task,args=(i,))
        t.start()

    4. 加强版threading.local

    储存结构:

    storage = {
    1111:{'x1':[]},
    1112:{'x1':[]}
    1113:{'x1':[]}
    1114:{'x1':[]}
    1115:{'x1':[]},
    1116:{'x1':[]}
    }

    import threading
    class Local(object):
        def __init__(self):
            object.__setattr__(self,'storage',{})
    
        def __setattr__(self, key, value):
            ident = threading.get_ident()
            if ident in self.storage:
                self.storage[ident][key].append(value)
            else:
                self.storage[ident] = {key:[value,]}
    
        def __getattr__(self, item):
            ident = threading.get_ident()
            if ident not in self.storage:
                return
            return self.storage[ident][item][-1]
    
    local = Local()
    
    def task(arg):
        local.x1 = arg
        print(local.x1)
    
    for i in range(5):
        t = threading.Thread(target=task,args=(i,))
        t.start()
  • 相关阅读:
    Web开发细节搜集
    excel设置单元格为文本
    网页QQ唤起
    .net提高文章
    代码重构学习
    js的undefined怎么判断
    微软.net一些类的源码
    FineMessBox的js依赖导致错误Uncaught ReferenceError: addEvent is not defined
    [译转]深入理解LayoutInflater.inflate()
    java 和 Android Base64加密
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/12637669.html
Copyright © 2020-2023  润新知