当前位置:   article > 正文

Flask中的线程隔离原理_flask框架,开启了多线程模式,同一请求会被干扰吗?

flask框架,开启了多线程模式,同一请求会被干扰吗?

线程隔离:

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找到内置字典的对应数据,这样就实现了线程隔离。我们可以看下源码:

<
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号