Flash 上下文管理

1、Local()

作用:为每个协程或线程创建一个独立的内存空间

储存格式:

{
    唯一标识: {'stack': []}
}

代码

try:
    from greenlet import getcurrent as get_ident
except:
    from threading import get_ident
class Local:
    __slots__ = ('__storage__', '__ident_func__')

    def __init__(self):
        # __storage__ = {1231:{'stack':[]}}
        object.__setattr__(self, '__storage__', {})
        object.__setattr__(self, '__ident_func__', get_ident)

    def __getattr__(self, name):
        try:
            return self.__storage__[self.__ident_func__()][name]
        except KeyError:
            raise AttributeError(name)

    def __setattr__(self, name, value):
        ident = self.__ident_func__()
        storage = self.__storage__
        try:
            storage[ident][name] = value
        except KeyError:
            storage[ident] = {name: value}

    def __delattr__(self, name):
        try:
            del self.__storage__[self.__ident_func__()][name]
        except KeyError:
            raise AttributeError(name)

2、LocalStack()

作用:通过栈操作local中的列表,列表中可以储存对象

代码

class LocalStack:
    def __init__(self):
        self._local = Local()

    def push(self,value):
        rv = getattr(self._local, 'stack', None) # self._local.stack =>local.getattr
        if rv is None:
            self._local.stack = rv = [] #  self._local.stack =>local.setattr
        rv.append(value) # self._local.stack.append(666)
        return rv

    def pop(self):
        """Removes the topmost item from the stack, will return the
        old value or `None` if the stack was already empty.
        """
        stack = getattr(self._local, 'stack', None)
        if stack is None:
            return None
        elif len(stack) == 1:
            return stack[-1]
        else:
            return stack.pop()

    def top(self):
        try:
            return self._local.stack[-1]
        except (AttributeError, IndexError):
            return None

3、上下文源码分析(request session)

A  wsgi->app.__call__->wsgi_app->ctx = self.request_context(environ) environ初次封装后的数据
a  封装session request : request_context->RequestContext
b  执行push方法->_request_ctx_stack.push(self) ctx ->_request_ctx_stack = LocalStack()->Local()

总结:

上下文管理分为:

request上下文管理

app上下文管理

__call__

wsgi_app  --> ctx requestcontent(request, session)
          -->push
              --> ctx LocalStack() --> Local()
              --> app LocalStack() --> Local()    
视图函数      --> app LocalPolicy  
            app --> 函数 --> app LockStack() --> Stack()
            g   --> 函数 --> app LockStack() --> Stack()
          --> ctx LocalPolicy
              request --> 函数 --> LocalStack() --> Stack()
              session --> 函数 --> LocalStack() --> Stack()
请求结束
    执行pop删除 ctx 和 app_ctx

1、g和session的生命周期不一样
session要存储在浏览器的cookie中
2、g和全局变量一致吗?
    - 全局变量项目启动加载
    - g会创建->销毁,全局变量不会

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。