• 自定义threading.local


    1.threading相关。

    # Author:Jesi
    # Time : 2018/12/28 14:21
    import threading
    import time
    from threading import local
    
    
    '''作用:为每个线程创建一个独立的空间,让线程与线程之间的数据做了一个隔离'''
    obj = local()
    
    def task(i):
        obj.xxx=i
        time.sleep(1)
        print(threading.get_ident(),i)
        print(obj.xxx)
    
    for i in range(10):
        t=threading.Thread(target=task,args=(i,))
        t.start()
        print(threading.get_ident)
    
    '''如何获取一个线程的唯一表示(类似于pid)'''

    2.local的基本实现原理:

    # Author:Jesi
    # Time : 2018/12/28 14:41
    import threading
    import time
    
    '''
    threading.local实现基本原理
    '''
    
    DIC={}
    
    def task(i):
        ident = threading.get_ident()
        if ident in DIC:
            DIC[ident]['xxx'] = i
        else:
            DIC[ident] = {'xxx':i}
        time.sleep(2)
        print(DIC)
        print(DIC[ident]['xxx'],i)
    '''
    {
        30800: {'xxx': 0}, 
        25808: {'xxx': 1}, 
        31416: {'xxx': 2}, 
        30368: {'xxx': 3}, 
        31620: {'xxx': 4}, 
        30828: {'xxx': 5}, 
        27888: {'xxx': 6}, 
        22396: {'xxx': 7}, 
        30780: {'xxx': 8}, 
        30856: {'xxx': 9}
    }
    '''
    
    for i in range(10):
        t=threading.Thread(target=task,args=(i,))
        t.start()

    3.自定义一个local,在Flask中就是这么实现的

    # Author:Jesi
    # Time : 2018/12/28 14:56
    import threading
    import time
    import greenlet
    
    try:
        get_ident = greenlet.getcurrent
    except Exception as e:
        get_ident = threading.get_ident
    
    
    class Local(object):
        DIC = {}
    
        def __getattr__(self, item):
            ident = get_ident()
            if ident in self.DIC:
                return self.DIC[ident].get(item)
            return None
    
        def __setattr__(self, key, value):
            ident = get_ident()
            if ident in self.DIC:
                self.DIC[ident][key] = value
            else:
                self.DIC[ident] = {key: value}
    
    
    obj = Local()
    
    
    def task(i):
        obj.xxx = i
        time.sleep(1)
        print(obj.xxx, i)
    
    
    for i in range(10):
        t = threading.Thread(target=task, args=(i,))
        t.start()
  • 相关阅读:
    面向对象编程思想-组合模式
    原生JS:Array对象详解
    一些XMLHttpRequest的例子代码
    详细解读XMLHttpRequest(一)同步请求和异步请求
    深入理解:JavaScript原型与继承
    轻松掌握:JavaScript状态模式
    轻松掌握:JavaScript装饰者模式
    轻松掌握:JavaScript享元模式
    轻松掌握:JavaScript模板方法模式
    回调函数的意义以及python实现
  • 原文地址:https://www.cnblogs.com/geogre123/p/10190730.html
Copyright © 2020-2023  润新知