首页 > 编程语言 >Python异步编程之web框架 异步vs同步 文件IO任务压测对比

Python异步编程之web框架 异步vs同步 文件IO任务压测对比

时间:2023-05-30 09:02:26浏览次数:41  
标签:__ 异步 框架 web Python text starlette

image

测试基本信息

主题:比较异步框架和同步框架在文件IO操作的性能差异
python版本:python 3.8
压测工具:locust
web框架:同步:flask 异步:aiohttp、starlette
异步文件模块:aiofiles、anyio.Path
请求并发量: 模拟10个用户
服务器配置: Intel(R) i7-12700F
客户端配置:Intel(R) i7-8700 3.20GHz

flask 同步框架

flask是python中轻量级web框架,特点是灵活、轻量级、扩展性高。同时flask是一个同步框架,文件操作内容是在请求中打开一个文件demo.txt,读取文件内容,然后返回文件内容。

from flask import Flask, request

app = Flask(__name__)


@app.route('/file')
def file():
    with open("demo.txt") as f:
        text = f.read()
    return text


if __name__ == '__main__':
    app.run(port=8090, host="0.0.0.0")

压测结果

并发量:453
image

aiohttp 异步框架

aiohttp 是一个基于 asyncio 的异步 HTTP 网络模块,它既提供了服务端,又提供了客户端。由于python内置函数open不支持异步读写,所以选用异步文件读写速度最快的 aiofiles 模块,打开同一个demo.txt文件。

from aiohttp import web
import aiofiles

routes = web.RouteTableDef()

@routes.get("/file")
async def file(request):
    async with aiofiles.open("demo.txt") as fp:
        text = await fp.read()
    return web.Response(text=text)

if __name__ == '__main__':
    app = web.Application()
    app.add_routes(routes)
    web.run_app(app)

压测结果

并发量:1490
image

starlette 异步框架

starlette 是当下火热的异步框架fastapi依赖的唯二模块之一,主要用于异步请求的处理。anyio是starlette依赖的包,一个封装asyncio的高级异步库,自带异步io操作。

from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
from anyio import Path


async def file(request):
    text = await Path('demo.txt').read_text()
    return JSONResponse(text)


app = Starlette(debug=True, routes=[Route('/file', file),])

压测结果

并发量:1538
image

对比

并发曲线图对比:
image

参数对比:

框架 文件IO并发量 延迟 纯框架无IO并发量
flask 453 21 ms 463
aiohttp 1490 6 ms 1455
starlette 1538 6 ms 1539

总结

在文件读写方面,异步框架性能是同步框架的3倍左右。同一个框架相较于无IO并发时性能略有下降但并不是很多,这说明文件IO阻塞并严重。下一篇比较数据库IO的并发性能。

准备连载一系列关于python异步编程的文章。包括同异步框架性能对比、异步事情驱动原理等。首发微信公众号,欢迎关注第一时间阅读。

标签:__,异步,框架,web,Python,text,starlette
From: https://www.cnblogs.com/goldsunshine/p/17441557.html

相关文章

  • python内置库--argparse
    1关于argparse从命令行工具运行python时,argparse可以解析命令行工具输入的各种数据,通过argparse提供的函数或者属性,我们可以获得它解析到的数据通过argparse,我们也可以自定义命令行选项,比如pytest-s-v,-s-v就是pytest定义的命令行选项,通过argparse,我们也可以定义自己的命......
  • # yyds干货盘点 # 使用PyInstaller工具将Python程序打包成Mac可执行文件步骤
    大家好,我是皮皮。一、前言前几天在Python钻石群【JethroShen】问了一个Python打包的问题,这里拿出来给大家分享下。二、实现过程这里【eric】问了【ChatGPT】,并给出了代码,如下所示:在Mac系统中,Python程序不能直接打包成.exe可执行文件,因为.exe是Windows系统下的可执行文件格式,而Mac......
  • 使用PyInstaller工具将Python程序打包成Mac可执行文件步骤
    大家好,我是皮皮。一、前言前几天在Python钻石群【JethroShen】问了一个Python打包的问题,这里拿出来给大家分享下。二、实现过程这里【eric】问了【ChatGPT】,并给出了代码,如下所示:在Mac系统中,Python程序不能直接打包成.exe可执行文件,因为.exe是Windows系统下的可执行文件格......
  • python推荐系统实现(矩阵分解来协同过滤)|附代码数据
    原文链接:http://tecdat.cn/?p=10911最近我们被客户要求撰写关于推荐系统的研究报告,包括一些图形和统计输出。用户和产品的潜在特征编写推荐系统矩阵分解工作原理使用潜在表征来找到类似的产品 1.用户和产品的潜在特征我们可以通过为每个用户和每部电影分配属性,然后将它们相......
  • web安全详解(渗透测试基础)
    一、Web基础知识1.http协议超文本传输协议是互联网上应用最广泛的一种网络协议。所有www文件都必须遵守的一个标准,是以ASCII码传输,建立在TCP/IP协议之上的应用层规范,简单点说就是一种固定的通讯规则。2.网络三种架构及特点网络应用程序架构包括三种:客户机/服务器结构(C/S)......
  • 接口、定时、异步
    1远程接口1.1URL与HttpUrlConnection//接口路径Stringpath="";//创建URLURLurl=newURL(path);//连接HttpURLConnectionurlConnection=(HttpURLConnection)url.openConnection();//开始连接urlConnection.connect();//获取字节流......
  • C# 异步编程(await、async&Task)
    视频链接:.NET6教程,.NetCore2022视频教程,杨中科主讲_哔哩哔哩_bilibili异步编程为什么要异步编程?几个误区:(1)异步不一定能提高效率(2)异步不是多线程传统多线程异步开发太麻烦。C#关键字:async、await。【async、await不等于“多线程”】async、await的基本使用“异步方法”:......
  • Python程序与设计
    Python学习笔记2-27在命令行窗口中启动的Python解释器中实现在Python自带的IDLE中实现print("Helloworld")编码规范每个import语句只导入一个模块,尽量避免一次导入多个模块不要在行尾添加分号“:”,也不要用分号将两条命令放在同一行建议每行不超过80个字符使用必要的空行可以增加代......
  • Python连接es笔记二之查询方式汇总
    本文首发于公众号:Hunter后端原文链接:Python连接es笔记二之查询方式汇总上一节除了介绍使用Python连接es,还有最简单的query()方法,这一节介绍一下几种其他的查询方式。以下是本篇笔记目录:query()方法介绍Q()查询排序分页source()指定返回字段extra()操作count......
  • Javaweb中在SQL语句中使用未知数进行多表查询
    这个问题主要是匹配好引号和单引号即可。如果是varchar型,那么变量要带单引号('),如果是int型就不用带。同时要注意用+号进行String的拼接。示例:publicList<Student>huizong_bujige(Stringkemu1){List<Student>list=newArrayList<>();Connectionconn......