flask的request和session设置方式比较新颖,如果没有这种方式,那么就只能通过参数的传递。
flask是如何做的呢?
1:本地线程,保证即使是多个线程,自己的值也是互相隔离
1 import threading 2 3 local_values = threading.local() 4 5 6 def func(num): 7 local_values.name = num 8 import time 9 time.sleep(1) 10 print(local_values.name, threading.current_thread().name) 11 12 13 for i in range(20): 14 th = threading.Thread(target=func, args=(i,), name='线程%s' % i) 15 th.start()
2:自定义threading.local
1 """
2 {
3 1368:{}
4 }
5
6
7
8 """
9 import threading
10 try:
11 from greenlet import getcurrent as get_ident # 协程
12 except ImportError:
13 try:
14 from thread import get_ident
15 except ImportError:
16 from _thread import get_ident # 线程
17
18
19 class Local(object):
20 def __init__(self):
21 self.storage = {}
22 self.get_ident = get_ident
23
24 def set(self,k,v):
25 ident = self.get_ident()
26 origin = self.storage.get(ident)
27 if not origin:
28 origin = {k:v}
29 else:
30 origin[k] = v
31 self.storage[ident] = origin
32
33 def get(self,k):
34 ident = self.get_ident()
35 origin = self.storage.get(ident)
36 if not origin:
37 return None
38 return origin.get(k,None)
39
40 local_values = Local()
41
42
43 def task(num):
44 local_values.set('name',num)
45 import time
46 time.sleep(1)
47 print(local_values.get('name'), threading.current_thread().name)
48
49
50 for i in range(20):
51 th = threading.Thread(target=task, args=(i,),name='线程%s' % i)
52 th.start()
升级版
1 import threading
2 try:
3 from greenlet import getcurrent as get_ident # 协程
4 except ImportError:
5 try:
6 from thread import get_ident
7 except ImportError:
8 from _thread import get_ident # 线程
9
10
11 class Local(object):
12
13 def __init__(self):
14 object.__setattr__(self, '__storage__', {})
15 object.__setattr__(self, '__ident_func__', get_ident)
16
17
18 def __getattr__(self, name):
19 try:
20 return self.__storage__[self.__ident_func__()][name]
21 except KeyError:
22 raise AttributeError(name)
23
24 def __setattr__(self, name, value):
25 ident = self.__ident_func__()
26 storage = self.__storage__
27 try:
28 storage[ident][name] = value
29 except KeyError:
30 storage[ident] = {name: value}
31
32 def __delattr__(self, name):
33 try:
34 del self.__storage__[self.__ident_func__()][name]
35 except KeyError:
36 raise AttributeError(name)
37
38
39 local_values = Local()
40
41
42 def task(num):
43 local_values.name = num
44 import time
45 time.sleep(1)
46 print(local_values.name, threading.current_thread().name)
47
48
49 for i in range(20):
50 th = threading.Thread(target=task, args=(i,),name='线程%s' % i)
51 th.start()