• 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会创建->销毁,全局变量不会
  • 相关阅读:
    mysql的统计函数(聚合函数)
    mysql中的五子查询
    mysql-蠕虫复制--快速插入数据
    mysql 外键的使用
    我的mysql入门笔记
    阿里云官方 Centos7 源码安装 LAMP环境
    xml格式数据转excel
    mysql的安装配置
    sublime中,怎么把所有的函数代码都折叠起来?
    点击文字或按钮弹出一个DIV窗口(DIV悬浮窗口)
  • 原文地址:https://www.cnblogs.com/wt7018/p/11605353.html
Copyright © 2020-2023  润新知