request源码分析:
1、若考虑单进程单线程,可使用全局变量;
2、若考虑单进程多线程,可使用threading.local;
3、若考虑单进程单线程(多个协程),threading.local做不到,需要自定义类似threading.loacal(支持协程);
如下是自定义的可支持协程,线程的Local类:
需要注意:
1、__setattr__方法
2、__init__方法
import threading
try:
from greenlet import getcurrent as get_ident #获取协程唯一标示
except ImportError:
try:
from thread import get_ident
except ImportError:
from _thread import get_ident #获取线程唯一标示
class Local(object):
def __init__(self):
#定义__setattr__就不能使用下面两行赋值语句,否则会造成递归栈溢出
# self.storage = {}
# self.get_ident = get_ident
#改为下面两句
object.__setattr__(self,"storage",{})
object.__setattr__(self, "get_ident", get_ident)
# 比set函数好,set函数需要通过 local.set("name",1