Python异步编程之web框架 异步vs同步 文件IO任务压测对比
Posted 金色旭光
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python异步编程之web框架 异步vs同步 文件IO任务压测对比相关的知识,希望对你有一定的参考价值。
测试基本信息
主题:比较异步框架和同步框架在文件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
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
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
对比
并发曲线图对比:
参数对比:
框架 | 文件IO并发量 | 延迟 | 纯框架无IO并发量 |
---|---|---|---|
flask | 453 | 21 ms | 463 |
aiohttp | 1490 | 6 ms | 1455 |
starlette | 1538 | 6 ms | 1539 |
总结
在文件读写方面,异步框架性能是同步框架的3倍左右。同一个框架相较于无IO并发时性能略有下降但并不是很多,这说明文件IO阻塞并严重。下一篇比较数据库IO的并发性能。
准备连载一系列关于python异步编程的文章。包括同异步框架性能对比、异步事情驱动原理等。首发微信公众号,欢迎关注第一时间阅读。
Python3 异步编程之进程与线程-1
Python3 异步编程之进程与线程-1
一、了解进程间通信
进程间通信
进程
线程
线程 vs 进程
IO模型
并发 vs 并行
异步 vs 同步
二、多线程与多进程的用法
计算密集型 vs I/O密集型
GIL
多线程
多进程
三、协程的好处与用法
协程
yield
yield from
四、进程间通信-IPC 01
管道:无名管道和命名管道(FIFO)
消息队列
信号量
共享存储
Socket
Streams
相关定义:
管道:
命名管道:
消息队列:
信号量:
共享内存:
元子操作:
五、进程特征
动态性
并发性
独立性
异步性
六、进程状态
运行 running 占用了CPU正在运行
就绪 ready 等待CPU
阻塞 blocked 暂时不具备运行条件,即使CPU空闲
相关定义:
进程控制块:
Unix系统中的几个进程控制操作:
线程:
线程之间共享:
线程的独立信息:
线程的创建:
七、了解进程间通信02
I/O模型
阻塞式
非阻塞式
I/O复用
信号驱动式
异步I/O
相关定义:
I/O操作的两个阶段:
阻塞式I/O:
非阻塞式I/O:
I/O复用:
信号驱动式:
异步I/O:
并发和并行:
异步与同步:
异步的实现:
处理多任务操作:
多进程/多线程
I/O模型
协程
多线程、多进程实现模式:master worker模式
master分配任务 多进程缺点:创建进程资源需要多frok()函数 多线程缺点:某个线程出问题,整个挂掉
以上是关于Python异步编程之web框架 异步vs同步 文件IO任务压测对比的主要内容,如果未能解决你的问题,请参考以下文章