flask的request和session设置方式比较新颖,如果没有这种方式,那么就只能通过参数的传递。

flask是如何做的呢?

1:本地线程,保证即使是多个线程,自己的值也是互相隔离

Flask请求和应用上下文源码分析
 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()
Flask请求和应用上下文源码分析

2:自定义threading.local

Flask请求和应用上下文源码分析
 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()
Flask请求和应用上下文源码分析

升级版

Flask请求和应用上下文源码分析
 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()
Flask请求和应用上下文源码分析

相关文章: