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

Posted 金色旭光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python异步编程之web框架 异步vs同步 文件IO任务压测对比相关的知识,希望对你有一定的参考价值。

比较python web框架 异步和同步在文件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任务压测对比的主要内容,如果未能解决你的问题,请参考以下文章

python异步编程之asyncio(百万并发)

python异步编程之asyncio(百万并发)

使用socket设计一个同步异步的python框架

Python并发编程之同步异步and阻塞非阻塞

概念理解之同步,异步,阻塞,非阻塞

Python并发编程之初识异步IO框架:asyncio 上篇