zoukankan      html  css  js  c++  java
  • threading.local

    作用:为每个线程创建一个独立的空间,使得线程对自己的空间中的数据进行操作(数据隔离)。

    import threading
    from threading import local
    import time
    
    obj = local()
    
    
    def task(i):
        obj.xxxxx = i
        time.sleep(2)
        print(obj.xxxxx,i)
    
    for i in range(10):
        t = threading.Thread(target=task,args=(i,))
        t.start()

    threading.get_ident():获取一个线程的唯一标记

    import threading
    
    def task(i):
        print(threading.get_ident(),i)
    
    for i in range(10):
        t = threading.Thread(target=task,args=(i,))
        t.start()
    
    '''
    打印结果:
            14164 0
            35664 1
            43900 2
            18356 3
            31240 4
            24556 5
            27340 6
            46396 7
            20792 8
            31104 9
    '''

    根据字典自定义一个类似于threading.local功能

    import time
    import threading
    
    DIC = {}
    
    def task(i):
        ident = threading.get_ident()
        if ident in DIC:
            DIC[ident]['xxxxx'] = i
        else:
            DIC[ident] = {'xxxxx':i }
        time.sleep(2)
    
        print(DIC[ident]['xxxxx'],i)
    
    for i in range(10):
        t = threading.Thread(target=task,args=(i,))
        t.start()

    根据字典自定义一个为每个协程开辟空间进行存取数据

    import time
    import threading
    import greenlet
    
    DIC = {}
    
    def task(i):
    
        # ident = threading.get_ident()
        ident = greenlet.getcurrent()  #获取协程的唯一标记
        if ident in DIC:
            DIC[ident]['xxxxx'] = i
        else:
            DIC[ident] = {'xxxxx':i }
        time.sleep(2)
    
        print(DIC[ident]['xxxxx'],i)
    
    for i in range(10):
        t = threading.Thread(target=task,args=(i,))
        t.start()

    通过getattr/setattr 构造出来 threading.local的加强版(协程)

    import time
    import threading
    try:
        import greenlet
        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.xxxxx = i
        time.sleep(2)
        print(obj.xxxxx,i)
    
    for i in range(10):
        t = threading.Thread(target=task,args=(i,))
        t.start()
  • 相关阅读:
    03:矩形分割 (二分)
    09:膨胀的木棍 (二分+角度计算)
    A Cubic number and A Cubic Number (二分) HDU
    B
    08:不重复地输出数 (set)
    10:河中跳房子 (二分)
    07:和为给定数 (二分)
    04:网线主管 (二分)
    河中跳房子
    010:输出前k大的数
  • 原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/13232536.html
Copyright © 2011-2022 走看看