基于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
猜你喜欢
- 这篇文章主要介绍了PyQt5 closeEvent关闭事件退出提示框原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- 前言检测图像中对象颜色的一种简单方法是首先将图像从 RGB 转换为 HSV 颜色空间,然后使用一系列色调检测对象,这可以通过使用 OpenC
- 比如在学习list、tuple、dict、str、os、sys等模组的时候,利用Python的自带文档可以很快速的全面的学到那些处理的函数。
- 发现这个也是偶然,在测试的时候发现的,因此问题还发现一个bug。蛮有意思~ 假如输入http://www.aspxhome.com的话,在
- 有人问为什么要去扫描网站目录:懂的人自然懂这个Python脚本的特点:1.基本完善2.界面美观(只是画了个图案)3.可选参数增加了线程数4.
- 1、Model signalsdjango.db.models.signales 作用于django的model操作上的一系列信号1)pre
- 一、学习目标:学会利用python的GUI做界面布局手写计算器代码熟悉控件的使用方法优化计算器代码,解决 获取按钮文本 的方法了解lambd
- 调用:var pageChange = function (index) { &n
- 代码如下: Function closeHTML(strContent) Dim arrTags, i, OpenPos, ClosePos
- 本文实例讲述了Python面向对象类继承和组合。分享给大家供大家参考,具体如下:在python3中所有类默认继承object,凡是继承了ob
- transforms.CenterCrop(size)将给定的PIL.Image进行中心切割,得到给定的size,size可以是tuple,
- 两年前发表的《The visual design of Web 2.0》中提到“Rounded everything”,圆角因使人感觉舒适的
- 关于argmax、argmin函数的使用1、在matlab的现有函数中,并没有argmax,argmin函数可以直接调用,要根据这两个函数的
- 现在网页的设计都讲究整体统一风格,无论是网页的文字、图像,还是浏览器的滚动条都要求颜色和风
- python 统计代码行数简单实例送测的时候,发现需要统计代码行数于是写了个小程序统计自己的代码的行数。#calclate_co
- 基本的网站页面设计元素布局比例统计,给大家做个参考,看看您的网站是否和下面的统计一致:标志图案:位置统计结果左上角84%右上角6%上方居中6
- python中函数定义参数有四种形式:def fun1(a,b,c): passdef fun2(a=1,b=2,c=3): &
- 1 abstract验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情
- Python提供多种数据类型来存放数据项集合,主要包括序列(列表list和元组tuple),映射(如字典dict),集合(set),下面对这
- 什么是Batch NormalizationBatch Normalization是神经网络中常用的层,解决了很多深度学习中遇到的问题,我们