首页 > 其他分享 >FastApi async函数一定比普通函数快吗,你是否有相同的问号

FastApi async函数一定比普通函数快吗,你是否有相同的问号

时间:2023-09-15 16:44:33浏览次数:30  
标签:协程 函数 start FastApi wash time async

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示

关键特性:
  • 快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。

  • 高效编码:提高功能开发速度约 200% 至 300%。*

  • 更少 bug:减少约 40% 的人为(开发者)导致错误。*

  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。

  • 简单:设计的易于使用和学习,阅读文档的时间更短。

  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。

  • 健壮:生产可用级别的代码。还有自动生成的交互式文档。

  • 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。

在Fastapi中,到底函数直接定义为async函数还是普通函数呢?如果直接写成async 就直接比普通函数快吗?

我脑子里充满了问号????????决定,试一试,直接开干!!!!!!!

实验工具

  • jmeter
  • 线程数设置的50,相当于并发用户数50
  • 采取实验的方式为:普通函数、只加了async关键字的协程函数、使用了async和await的协程函数

一、普通函数

@app.get('/wash')
def wash_clothes():
    start = time.time()
    time.sleep(1)
    end = time.time()
    return {"time": end - start}
结果:总共耗时2秒,平均1秒左右

image

二、只加了async关键字的协程函数

@app.get('/wash')
async def wash_clothes():
    start = time.time()
    time.sleep(1)
    end = time.time()
    return {"time": end - start}
结果:总共耗时50秒,最小值1秒,最大值等待了49秒,我的理解是仅仅了加了关键字,但是没有把耗时的代码加入到事件循环当队列中,所以一个个干等,中间的耗时代码无法挂起

image

三、加了async、await关键字的协程函数

@app.get('/wash')
async def wash_clothes():
    start = time.time()
    # time.sleep(1)
    await asyncio.sleep(1)  # 这里要用asyncio模块下的sleep,才是可等待的对象
    end = time.time()
    return {"time": end - start}
结果:总共耗时2秒,平均1秒左右,

image

四、因为上一步的实验,协程的函数与普通的函数在50并发数下差别不大,现在将并发数调整为150再试一试
  • 普通函数(150并发,总共耗时4秒)
    image

  • 协程函数(150并发,总共耗时2秒)
    image

结论,async函数,如果用正确了在并发的情况下确实是比普通函数要快,但是一定要用正确,否则比普通函数还要慢,还有就是普通函数用的是多线程的技术,放入到的thread pool中的

标签:协程,函数,start,FastApi,wash,time,async
From: https://www.cnblogs.com/bangbangzoutianya/p/17700898.html

相关文章

  • 人脸识别中对比学习的损失函数(演化进程)
    参考文献:https://zhuanlan.zhihu.com/p/40775212https://blog.csdn.net/yiran103/article/details/836846131.softmax在初期,人脸识别模型通常使用softmax损失函数,其实就是在超平面上进行分类划分。这样的分类其实是乱七八糟的。注意,由此式不难得到:可以改写成下式这样,带有......
  • 无涯教程-JavaScript - GETPIVOTDATA函数
    描述GETPIVOTDATA函数返回存储在数据透视表报表中的数据。您可以使用它从数据透视表报表中检索摘要数据,前提是该摘要数据在报表中可见。您可以通过以下方式快速输入一个简单的GETPIVOTDATA公式:在要向其返回值的单元格中键入=(等号),然后在"数据透视表"报表中单击包含要返回的......
  • Adding API Key Authentication to a FastAPI application
    https://joshdimella.com/blog/adding-api-key-auth-to-fast-apiStep1:DefineaListofValidAPIKeysAPI_KEYS=["9d207bf0-10f5-4d8f-a479-22ff5aeff8d1","f47d4a2c-24cf-4745-937e-620a5963c0b8","b7061546-75e8-444b-a2c4......
  • 《特殊函数概论》Chapter 3习题解答
    《特殊函数概论》Chapter3习题解答卷心汪汪队众所周知,王竹溪、郭敦仁所著的《特殊函数概论》是一本对初学特殊函数的同学非常友好的书,特别是对我这种英语不好的人来讲,不用一边翻字典一边看Whittaker&Waston了但是据我所知,特殊函数概论应该是没有完整......
  • Vue2 Modal组件函数式调用封装(基于Ant Design Vue 组件)
    一、h函数(createElement函数)版本importVuefrom"vue";import{Modal}from"ant-design-vue";//获取扩展Modal组件functiongetModalConstructor(modalProps,childConfig){const{component,...restConfig}=childConfig;returnVue.extend({......
  • 无涯教程-JavaScript - ADDRESS函数
    描述给定指定的行号和列号,您可以使用ADDRESS函数获取工作表中单元格的地址。如,ADDRESS(2,3)返回$C$2。再举一个Example,ADDRESS(77,300)返回$KN$77。您可以使用其他函数(如ROW和COLUMN函数)为ADDRESS函数提供行号和列号参数。语法ADDRESS(row_num,column_num,[abs_nu......
  • Vue源码学习(六):(支线)渲染函数中with(),call()的使用以及一些思考
    好家伙, 昨天,在学习vue源码的过程中,看到了这个玩意嘶,看不太懂,研究一下 1.上下文这段出现vue模板编译的虚拟node部分exportfunctionrenderMixin(Vue){Vue.prototype._c=function(){//创建标签returncreateElement(...arguments)......
  • 无涯教程-JavaScript - XOR函数
    描述XOR函数返回所有参数的逻辑异或。如果所提供条件的奇数判断为TRUE,则XOR函数返回TRUE,否则返回FALSE。语法XOR(logical1,[logical2],…)争论Argument描述Required/Optionallogical1logical1isrequiredandsubsequentlogicalvaluesareoptional.1to254c......
  • 通过UltraSync减轻主节点负担、提升业务系统性能,AntDB如何做到?
    众所周知,数据库在多中心场景下,主中心主库不仅要承担原本业务的压力,而且还要将redo日志传输到不同的备库端,这样对主库将产生很大的性能影响。通常情况下,备中心和主中心不在同⼀机房,为了保证业务响应速度,主中心主节点和备中心各主节点之间的复制流通常是异步的,当主中心发生故障时,主......
  • 函数-上
    引入:先问大家一个问题,大家洗过衣服吧?手动怎么洗?拿个盆,接水,放衣服,倒洗衣粉,洗,涮,拧干挺费劲的,有没有简便的方法?使用洗衣机,衣服放进去,倒上洗衣粉,按开关,一切就都搞定了在生活中这样的例子有很多,大到洗衣机空调,小到水龙头剪刀。每个工具都有自己不同的功能。为了生活方便简洁,就会使用这些......