zoukankan      html  css  js  c++  java
  • 自定义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()
  • 相关阅读:
    poj1113--凸包(Andrew)
    php变量内存完全释放
    php的内存分配还是很智能的
    git 忽略权限记录一下
    开启事务处理插入多条数据 速度也可以
    var_dump(is_writeable(ini_get("session.save_path")));
    要注意一下xss攻击啊
    select *," as A from B union ...
    多次踩坑
    js instanceof运算符
  • 原文地址:https://www.cnblogs.com/geogre123/p/10190730.html
Copyright © 2011-2022 走看看