前言

在python编程中,通过协程实现的异步编程号称能够提高IO密集型任务的并发量。本系列比较web服务器同步框架和异步框架的性能差异,包括无IO接口和常见IO操作,如文件、mysql、redis等。使用压测工具locust测试相同条件下两种编程模式能够处理请求的速度。

测试基本信息

主题:单纯比较异步框架和同步框架的性能,无任何IO

python版本:python 3.8

压测工具:locust

web框架:同步:flask 异步:aiohttp、starlette

请求并发量: 模拟10个用户

服务器配置: Intel(R) i7-12700F

客户端配置:Intel(R) i7-8700 3.20GHz

flask 同步框架

flask是python中轻量级web框架,特点是灵活、轻量级、扩展性高。flask同时是一个同步框架,flask诞生的时候python的异步编程体系还不成熟,当然截止到目前flask肯定是支持异步框架的。但是让其作为同步框架的代表,参加pk。

from flask import Flask, request

app = Flask(__name__)

@app.route('/index')
def index():
return "hello world" if __name__ == '__main__':
app.run(port=5000, host="0.0.0.0")

压测准备

locust是一个python语言开发的压力测试工具,有图形化界面,基于协程并发,能够支持在单台机器中支持数以千计的模拟用户,也支持分布式压测。

使用locust压测,并发模拟10个用户,10个用户尽可能快的发送请求,并发量RPS取决于请求返回的速度,也就是服务端的处理速度。

from locust import HttpUser, task

class UserBehavior(HttpUser):
# 请求host的/index接口
@task(1)
def stress_index(self):
self.client.get("/index")
locust -f locust_stress.py

访问 127.0.0.1:8098,启动服务,按照10个模拟用户发送请求

压测结果

并发量:463

aiohttp 异步框架

aiohttp 是一个基于 asyncio 的异步 HTTP 网络模块,它既提供了服务端,又提供了客户端。所以可以将aiohttp用于web框架的服务端,监听http请求。

from aiohttp import web

routes = web.RouteTableDef()

@routes.get("/index")
async def index(request):
return web.Response(text="Hello World") if __name__ == '__main__':
app = web.Application()
app.add_routes(routes)
web.run_app(app)

压测结果

并发量:1455

starlette 异步框架

starlette 是当下火热的异步框架fastapi依赖的唯二模块之一,主要用于异步请求的处理。

from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
from uvicorn.main import run async def index(request):
return JSONResponse({'hello': 'world'}) app = Starlette(debug=True, routes=[Route('/index', index),]) if __name__ == "__main__":
run(app, host="0.0.0.0")

压测结果

并发量:1539

对比

并发曲线图对比:

参数对比:

框架 并发量 延迟
flask 463 19 ms
aiohttp 1455 6 ms
starlette 1539 5 ms

总结

可以看出异步框架的性能是同步框架的3倍多还不止,数据如此夸张的原因是同步框架的处理所有请求都是按照顺序执行的,当请求有阻塞时需要等待。而异步框架处理请求遇到阻塞可以转而处理别的请求,所以相同时间异步框架能够处理的请求数远高于同步。

了解了纯框架的并发能力之后,下一篇来看看接口中有IO任务的并发对比。

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

Python异步编程之web框架异步vs同步 无IO任务压测对比的更多相关文章

  1. python高级编程之 web静态服务器

    返回固定数据 import socket def request_handler(new_client_socket): """ 响应客户端请求的核心函数 "& ...

  2. python异步编程之asyncio

    python异步编程之asyncio   前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率, ...

  3. 异步编程之Promise(3):拓展进阶

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  4. 异步编程之Promise(2):探究原理

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  5. 200行自定义异步非阻塞Web框架

    Python的Web框架中Tornado以异步非阻塞而闻名.本篇将使用200行代码完成一个微型异步非阻塞Web框架:Snow. 一.源码 本文基于非阻塞的Socket以及IO多路复用从而实现异步非阻塞 ...

  6. Tornado----自定义异步非阻塞Web框架:Snow

    Python的Web框架中Tornado以异步非阻塞而闻名.本篇将使用200行代码完成一个微型异步非阻塞Web框架:Snow. 一.源码 本文基于非阻塞的Socket以及IO多路复用从而实现异步非阻塞 ...

  7. 150行代码搭建异步非阻塞Web框架

    最近看Tornado源码给了我不少启发,心血来潮决定自己试着只用python标准库来实现一个异步非阻塞web框架.花了点时间感觉还可以,一百多行的代码已经可以撑起一个极简框架了. 一.准备工作 需要的 ...

  8. 异步编程之Generator(1)——领略魅力

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  9. (翻译)异步编程之Promise(1):初见魅力

    原文:https://www.promisejs.org/ by Forbes Lindesay 异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2) ...

  10. net异步编程之await

    net异步编程之await 初探asp.net异步编程之await   终于毕业了,也顺利进入一家期望的旅游互联网公司.27号入职.放肆了一个多月没写代码,好方啊. 另外一下观点均主要针对于await ...

随机推荐

  1. Python学习笔记--高阶技巧

    闭包(避免全局变量被修改的风险) 函数的嵌套的利用 若是只是调用到外部函数的值,只需要用到函数的嵌套,具体实现如下: 若是要对外部函数的值进行修改,需要用到nonlocal关键字,具体实现如下: at ...

  2. PyQt-Fluent-Widgets:一个 Fluent Design 风格的组件库

    简介 这是一个使用 PyQt/PySide 编写的 Fluent Design 风格的组件库,包含最常用的组件,支持亮暗主题无缝切换.实际上此项目是从 Groove Music 项目剥离出来的子项目, ...

  3. 使用 Agora SDK 开发 React Native 视频通话App

    在 React Native 的应用中,从头开始添加视频通话功能是很复杂的.要保证低延迟.负载平衡,还要注意管理用户事件状态,非常繁琐.除此之外,还必须保证跨平台的兼容性. 当然有个简单的方法可以做到 ...

  4. Agora Flat:在线教室的开源初体验

    开发者其实很多时候都非常向往开源,开源领域的大佬也特别多,我们谈不上有多资深,也是一边探索一边做.同时,也希望可以借这次机会把我们摸索到的一些经验分享给大家. 01 Flat 是什么 Flat 是一个 ...

  5. C# 动态创建类,动态创建表,支持多库的数据库维护方案

    1.创建表 SqlSugar支持了3种模式的建表,非常的灵活,可以MYSQL MSSQL ORACLE等用同一语法创建数据库,不需要考虑数据库的兼容性 中间标准: string  大文本 5.1.3. ...

  6. 修改Win+E映射

    !!!!!!此过程需要修改注册表,请谨慎操作 作用 修改后可以实现Win+E快捷打开任意程序 从原始资源管理器到其它应用 注册表路径: HKEY_CLASSES_ROOT\Folder\shell\o ...

  7. STM32 HAL库学习 (3) 中断!

        中断在单片机开发中有着重中之重的地位.    中断即打断,实至CPU再执行当前程序时,由于系统出现了某种需要处理的紧急情况,CPU暂停正在执行的程序,转而去执行另一段特殊程序来处理的出现的紧急 ...

  8. EF Core从TPH迁移到TPT

    Intro EF Core支持多种方式处理具有继承关系的表,现在支持TPH.TPC(EF Core 7).TPT,具体的实现方式可以参考官方文档和这篇文章. 大致总结一下不同的方式的区别: TPH:所 ...

  9. 开发轻量级REST API样板 基于Node.js、MongoDB 通过Mongoose驱动

    ZY.Node.Mongodb https://gitee.com/Z568_568/node.mongodb.git https://github.com/ZHYI-source/ZY.Node.M ...

  10. [网络/Linux]网络嗅探工具——nmap

    1 nmap 简介 Nmap 即 Network Mapper,最早是Linux下的网络扫描和嗅探工具包. nmap是网络扫描和主机检测的工具,用nmap进行信息收集和检测漏洞,功能有: 检测存活主机 ...