基于fastapi框架的异步解读
作者:id老猫 发布时间:2022-12-19 21:45:24
使用fastapi框架开发web项目
1、为什么要用fastapi?
一直以来博主都是一直使用Django进行开发的,最近公司开始使用fastapi进行小项目的开发
通过博主对fastapi文档的翻阅,发现fastapi最引人注意的就是他的异步支持。(当然最新版的django也已经支持异步请求)
2、什么是异步?
异步相对应的就是同步
同步就是多件事排队做
而异步就是多件事同时做
3、在django中是怎么实现异步的呢?
django采取的是多线程实现异步。
当一个线程在做耗时操作的时候进行线程间切换,给人一种多个线程在同时运行的感觉。(当然了,多核cpu确实是真正的多线程。)。
切换的同时不仅要重新获取GIL锁,还要重新加载和记住上下文,这些开销对服务的性能是有一定影响的
4、fastapi中的异步
4.1 简单介绍一下协程的概念
相信大家都听说过协程这个概念,
协程是在一个线程间进行用户级资源切换的概念
是不是很抽象?
我来解释一下:
首先我们要了解线程属于进程,而协程属于线程
写过爬虫的同学应该了解过yield关键字,他就可以简单的作为一个协程来用
他可以构造一个生成器,可能有些同学会把生成器和一个普通的可迭代对象混为一谈(例如列表)
但是这又跟协程有什么关系呢?
是这样的,当用户要取一个元素的时候,这个生成器相当于被激活了,相当于开始占用线程资源,生成一个元素,返回之后就让出线程资源,直到用户取下一个元素。
这就是协程的思想:它没有线程间切换时资源的消耗大,并且完全由用户控制
4.2 fastapi中的协程
fastapi由较为完善的异步处理方案(没有非常完善)
他的基本语法与flask较为相似(虽然博主只写过一点flask)
值得一提的是asgi异步网关协议,这个网关协议有完善的异步请求与websocket的支持。
他对async/await有很好的支持
对应的web服务器是Uvicorn
我们可以使用sqlalchemy进行异步数据库查询
其实一个web项目的性能瓶颈大部分还是在io方面(数据库查询,web请求,系统io)
例如有些数据库查询确实耗时,我们又不想让他阻塞当前线程,我们就可以使用异步数据库查询
fastapi会在你注明异步数据库查询的地方让出cpu资源,让他去处理别的东西(比如另一个请求)
然后当你的数据库查询结束返回之后,再次回到当初让出资源的地方,继续往下执行。
5、协程相较于线程的优势
协程可以记住上下文,从而避免在线程间切换中针对上下文切换的资源消耗和关于GIL锁的资源消耗
6、协程的使用场景
我们可以把计算机的动作大致分成两种,一种是计算型,一种是io型,当一个任务是计算型的时候,就意味着cpu要一直运行,这个时候我们是没法让出cpu资源的,而当一个任务是io型的,就相当于cpu一直在休息,在等待,这个时候我们就可以让出cpu的占用,让他去处理别的任务
所以协程异步并不是所有场景都适用,他主要用于io场景。
来源:https://blog.csdn.net/laomao9112/article/details/122041959


猜你喜欢
- python第三方库的安装PyInstaller库PyInstaller库能够在不同操作系统下将python源文件打包,变成直接可运行的可执
- 目录一、时间序列数据的生成二、Pandas设置索引三、 时间序列数据的截取四、Pandas重复值处理4.1 查询是否有重复值4.2 去除重复
- 京东商品详细的请求处理,是先显示html,然后再ajax请求处理显示价格。1.可以运行js,并解析之后得到的html2.模拟js请求,得到价
- 使用go语言的第三方包:github.com/pkg/sftp和golang.org/x/crypto/ssh实现文件和文件夹传输。1、创建
- 使用vue去请求接口发现问题来了:我请求只能请求一次,然后在按按钮去请求的时候发现502(这个是接口定义的)502就是传了空的值过来 这个是
- 实现流程从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样
- 前言在我们使用线程池控制线程运行时,或者是写爬虫时不停发送request获取地址,都需要我们对运行的线程加以控制。有这样一种场景,当你写入一
- 从而达到方便快捷的目的,但是它在存储信息的时候往往会有一些敏感的东西,这些东西可能成为被攻击的目标,如银行的账号、信用卡事务或档案记录等。这
- 前言上网浏览网页的时候,看见好的内容免不了要使用复制粘贴,但是我们看到的内容、心里想要的内容和实际粘贴后的内容往往不一致。数据的获取始于复制
- Mint UI 是饿了么开源的,基于 Vue.js 的移动端组件库。关于Mint UI,有文档不够准确详尽,组件略显粗糙,功能不够完善等问题
- 在开发 图像 动画 游戏 相关的程序时, 双缓冲( double-buffer )一直是程序员常用(必用)的技巧. 当然 随着各种引擎 框架
- 下载a.我这里用的是 ZIP Archive版的,win8 64位的机器都支持 这个所以我建议都用这个。还有这个比较简单而且还很
- python3.8新功能相关文章Python 3.8 新功能大揭秘【新手必学】 Python 3.8 新功能来一波(大部分人都不知
- 目的:把训练好的pth模型参数提取出来,然后用其他方式部署到边缘设备。Pytorch给了很方便的读取参数接口:nn.Module.param
- 最近学到了一个有趣的装饰器写法,就记录一下。装饰器是一个返回函数的函数。写一个装饰器,除了最常见的在函数中定义函数以外,Python还允许使
- 目录v-model.sync细微之处的区别总结功能作用场景:v-model <!--父组件--> &n
- Python安装Graphviz画图器首先,要明确他是一个独立的软件,如果大家用pip的方法装了graphviz可以先卸载pip unins
- 一天不小心把ROOT的权限改到最小了(只能登录,什么都做不了),这可急死我了.重装的话太麻烦,而且里面有很多的用户,一个个重新弄不知道到什么
- 安装python之后,我们往往面临这样一个问题,在命令行输入“python”,竟然出错,难道是没有安装成功吗?非也,其实是你的系统环境变量没
- 由于办公需要“每天定时推送某消息用来提醒群里面所有人”,有同事提议用企业微信自带的机器人来实现此功能。我觉得企业微信的这个工具还不错,具体使