Flask中的线程隔离原理

本文探讨了Python中的线程隔离概念,特别是在Flask框架中的应用。Flask通过Local和LocalStack实现线程间的隔离,保证在多线程环境中,如app、request、session和g等对象在各自线程中的独立性。Local类利用字典存储线程特定的数据,而LocalStack则提供了栈结构的线程隔离。通过示例代码,展示了如何在Flask中实现线程隔离的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程隔离:

Python因为GIL(全局解释器锁)的原因,本身实现的多线程就是伪多线程,同一时间只能有一个CPU核运行一个Python应用,这里就有人觉得Python的多线程没有用。这里可以这样理解:其实应用分为两种,一种是CPU运算密集的应用,一种是IO密集的应用,顾名思义,前者是比较依赖CPU资源,后者则是(数据库连接请求、文件读取、网络请求)比较多的应用。相对于IO密集的应用,Python的多线程还是有一定的用处。

Flask的线程隔离是针对app、request、session、g这几个对象,可以从原码flask下的globals.py里可以看到。

我们假设开启了Flask的多线程,同一时间内有多个请求进来,会生成,也就是new出多个相应的Resquest对象,对应的就是视图函数,也就是请求处理函数里引用的request对象(from flask import request),怎么保证在各自的线程里调用的request就是对应的的对象?这里有点绕。

这里我们要介绍两个类:Local、LocalStack。

Local

第三方库werkzeug下的类werkzeug.local.Local,主要是用字典dict的方式实现的该类实例对象属性的线程隔离。

实现线程隔离的原理:Local内置了一个字典对象,每当该类的实例操作实例属性时,会在内置字典中新增一项,key为当前线程的id,value为一个字典,存的是实例属性与值的映射,当我们要获取这个实例的属性时,会用当前线程id为key找到内置字典的对应数据,这样就实现了线程隔离。我们可以看下源码:

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值