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()