自定义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()

猜你喜欢

转载自www.cnblogs.com/geogre123/p/10190730.html
今日推荐