Flask之分析线程和协程threadinglocal应用场景(Flask的request,session内部实现原理2)

本文深入分析了Flask框架中request和session的内部实现原理,探讨了在单进程多线程或多协程场景下,如何使用threading.local以及如何自定义支持协程的Local类。重点关注了threading.local的局限性和解决策略,并介绍了自定义Local类的关键方法,如__setattr__和__init__。
摘要由CSDN通过智能技术生成

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值