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

这篇具有很好参考价值的文章主要介绍了Python异步编程之web框架异步vs同步 无IO任务压测对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

前言

在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个模拟用户发送请求
Python异步编程之web框架异步vs同步 无IO任务压测对比

压测结果

并发量:463
Python异步编程之web框架异步vs同步 无IO任务压测对比

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
Python异步编程之web框架异步vs同步 无IO任务压测对比

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
Python异步编程之web框架异步vs同步 无IO任务压测对比

对比

并发曲线图对比:
Python异步编程之web框架异步vs同步 无IO任务压测对比

参数对比:

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

总结

可以看出异步框架的性能是同步框架的3倍多还不止,数据如此夸张的原因是同步框架的处理所有请求都是按照顺序执行的,当请求有阻塞时需要等待。而异步框架处理请求遇到阻塞可以转而处理别的请求,所以相同时间异步框架能够处理的请求数远高于同步。
了解了纯框架的并发能力之后,下一篇来看看接口中有IO任务的并发对比。

准备连载一系列关于python异步编程的文章。包括同异步框架性能对比、异步事情驱动原理等。首发微信公众号,欢迎关注第一时间阅读。
Python异步编程之web框架异步vs同步 无IO任务压测对比文章来源地址https://www.toymoban.com/news/detail-457051.html

到了这里,关于Python异步编程之web框架异步vs同步 无IO任务压测对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux搭建Web服务器(一)——阻塞与非阻塞、同步与异步、Linux五种IO模型

    目录 0x01 阻塞与非阻塞、同步与异步 阻塞与非阻塞 同步与异步 总结 0x02 Unix、Linux上的五种IO模型 阻塞(blocking) 非阻塞(non-blocking——NIO) IO复用(IO multiplexing) 信号驱动(signal-driven) 异步(asynchronous) 为了理清楚这几个概念,我们可以从 数据就绪 以及 数据读写 层面

    2023年04月10日
    浏览(36)
  • python 异步任务框架 Celery 入门,速看!

    Celery 是使用 python 编写的分布式任务调度框架。 它有几个主要的概念: celery 应用 用户编写的代码脚本,用来定义要执行的任务,然后通过 broker 将任务发送到消息队列中 broker 代理,通过消息队列在客户端和 worker 之间进行协调。 celery 本身并不包含消息队列,它支持一下消

    2024年02月13日
    浏览(22)
  • web前端框架Javascript之JavaScript 异步编程史

    早期的 Web 应用中,与后台进行交互时,需要进行 form 表单的提交,然后在页面刷新后给用户反馈结果。在页面刷新过程中,后台会重新返回一段 HTML 代码,这段 HTML 中的大部分内容与之前页面基本相同,这势必造成了流量的浪费,而且一来一回也延长了页面的响应时间,总

    2024年02月14日
    浏览(30)
  • 【文末送书】Python高并发编程:探索异步IO和多线程并发

    欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。搜索关注公粽号 《机器和智能》 发送“刷题宝

    2024年02月15日
    浏览(21)
  • Python Sanic 异步 Web 框架

    Sanic 是一个基于 Python 3.6+ 的异步 Web 框架,它使用了 Python 的 async/await 语法来实现高效的非阻塞 IO 操作。 Sanic 的主要作用是提供一个快速、轻量级的方式来构建异步 Web 服务,适用于处理大量并发请求的场景。 以下是一个简单的示例代码,演示了如何使用 Sanic 创建一个简单

    2024年02月22日
    浏览(17)
  • 20230515学习笔记——js中的同步任务与异步任务,宏任务与微任务

    2023-05-15 (1)js中的同步任务与异步任务 ①同步任务是指:不耗时的任务,就是执行很快, ②异步任务是指:耗时的任务,它里面有一个机制是EventLoop(事件循环),即值耗时任务会被js分配到宿主环境中进行执行,执行后的结果放到一个“消息队列”中,当js将同步任务执行完

    2024年02月04日
    浏览(21)
  • 前端中的同步和异步任务详细说明

    一、什么是同步/异步任务? 同步任务:指的是在主线程上排队执行的任务,只有当前一个任务执行完毕 才能执行下一个任务(按照顺序执行) 异步任务:指的是不进入主线程上的任务,进入任务队列的任务,只有当任务队列通知主线程某个异步任务可以执行,方可进入主线

    2024年04月26日
    浏览(16)
  • Python web 框架对比:Flask vs Django

    哈喽大家好,我是咸鱼 今天我们从几个方面来比较一些现在流行的两个 python web 框架——Flask 和 Django,突出它们的主要特性、优缺点和简单案例 到最后,大家将更好地了解哪个框架更适合自己的特定需求 参考链接:https://djangocentral.com/flask-vs-django-selecting-the-perfect-python-web

    2024年02月11日
    浏览(28)
  • this关键字和同步异步宏认为微任务理解

    目录 js面试常见问题:1.this指向  2.闭包定义和作用 3.原型链 4.异步协程 this this主要有以下几个使用场合。 1)全局环境 (2)构造函数 (3)对象的方法 避免多层this 避免数组处理方法中的 this 避免回调函数中的 this 绑定 this 的方法 Function.prototype.call() Function.prototype

    2024年02月15日
    浏览(28)
  • 同步编程和异步编程的区别

    我在这里用几个例子(附带图文)给你们讲解一下,具体区别。   一、同步 执行步骤: step1 ===》 step2 ===》step3  先打印 hello moon, 再打印图片, 等待图片打印完,再打印 hello Jupiter 一步一步执行,等待上一步执行完,再执行下一步。 二、异步 step1 ===》step2 / step3  先打印

    2024年02月15日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包