码迷,mamicode.com
首页 > 其他好文 > 详细

Flash 上下文管理

时间:2019-09-28 23:13:27      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:from   stack   key   was   gre   dex   The   storage   else   

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()

 

Flash 上下文管理

标签:from   stack   key   was   gre   dex   The   storage   else   

原文地址:https://www.cnblogs.com/wt7018/p/11605353.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!