Sanic、uvloop及Asyncio的局限

news2024/10/7 14:23:19

Sanic

  • sanic使用基于libuv的uvloop事件循环替代python asnycio自带的事件循环替代,以此提高异步性能。
  • Flask和Django是同步框架,Tornado、FastApi和Sanic均为异步框架,Sanic的性能最好。
  • Sanic入门教程:Sanic:一款号称 Python 中性能最高的异步 web 框架,全方位介绍 Sanic
  • Sanic支持通过workers设置并发的工作进程,开启多进程并发后,子进程会开启多个服务,主进程内部通过路由分发实现负载均衡。

uvloop

  • uvloop是Python原生事件循环的替代品,能提高了性能。

  • 为什么提高了性能?:

    1. uvloop是基于Cython写的,执行效率更高。
    2. uvloop底层基于libuv,而libuv是高性能、跨平台的异步IO库,nodejs的事件循环也是基于libuv的。【libev介绍详见:网络io模型、同步异步及libuv】
  • 缺点:uvloop不支持Windows。

  • 即便不开发 Sanic 服务,也可以使用 uvloop 来替换 asyncio 内部的事件循环。

import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

uvloop的性能测试

  • 结论:纯uvloop的性能直逼Golang,但是Python的其他异步库可能成为性能瓶颈,如aiohttp的http解析。
  • 如果追求性能,建议使用Golang。

uvloop官方测试结果

TCP协议

这是用简单的echo服务做的测试,不能代表所有生产环境的情况。

  • 分别用1KiB数据包、10KiB、100KiB做了测试。
  • 可以看到uvloop确实牛逼,性能直逼Go。
    在这里插入图片描述
HTTP协议
  • 【解释】:官方人员本来想用aiohttp这个Python中最常用的异步http服务库测试的。但是它的http解析器效率太低了,已然成为整个系统的瓶颈,所以他们手动实现了http-parser(起初是为Nginx设计的,所以效率非常高)的Python版本,称之为httptools。
  • uvloop对aiohttp并没有性能提升!
    在这里插入图片描述

第三方测试

  • 参考web框架的性能排名榜:Web Framework Benchmarks
  • 使用uvloop的Sanic性能并不如Gin。

对Asyncio局限的讨论

Python基于协程的异步是为了弥补GIL对多线程并发的限制。
如果追求性能,建议使用原生支持高并发和协程的语言,如:Golang、node.js等,代价就是切换技术栈,开发成本的增加。

同步和异步代码难以统一

  • 同步和异步的语法 和 开发思路不同,导致代码维护成本翻倍。
  • 同步代码可以利用多线程并发,但是协程不是线程安全的,而且多线程会导致协程效率变差,甚至不如多线程并发效率。
  • 异步代码需要处处async/await,但是如果使用库不支持异步,仍然为io同步,也就没有意义。

大量库仍然是同步的

目前主要是很多库还是同步的。
只要有一处同步就会阻塞整个线程及其中的所有协程。

Python官方日志库logging

  • 直到Python3.11仍然是同步的,如果业务代码中必然大量输出日志,日志会成为整个框架或脚本的性能瓶颈。
  • 可选的异步库:
    • aiologger:star非常少,可靠性未知。
    • 注意:aiologger仅当登录到 stdout/stderr 时才完全异步。如果您登录磁盘上的文件,则您并不是完全异步的,而是将使用线程。

Python内置的Open操作文件

  • 直到Python3.11仍然是同步的,
  • 可选备用库:
    • aiofiles:star较多可靠。
      • 底层是基于线程池:aiofiles helps with this by introducing asynchronous versions of files that support delegating operations to a separate thread pool.

aiohttp库

  • uvloop的测试人员发现该库的http解析器性能很差,所有用Python把Nginx的http解析重新实现了一遍。

statsd库

  • pystatsd:该库用于向statsD服务打点,常用于搭建监控系统,配合Grafana和Graphite使用。
  • 可选的异步库:
    • aiodogstatsd:star非常少,可靠性未知。
    • udp-echo-server:使用异步框架,发送upd,自己完成封装。

参考资料

  • Python 协程系列之EventLoop
  • 你必须要会uvloop!让Python asyncio异步编程性能直逼Go协程性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/717765.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阶段小作业:基于docker安装mysql

1.在docker hub 搜索Mysql镜像 docker search --limit 5 Mtsql 2.拉取Mysql 5.7 镜像 docker pull mysql 注意mysql是小写哦 3.创建mysql容器,主机3306端口号映射到容器3306端口 docker run -d -p 3306:3306 --privilegedtrue -v /tmp/mysql/log:/var/log/mysql …

OpenVRLoader 与UnityXR Interaction ToolKit不兼容

1、游戏的VR设备监听与输入都是基于UnityXR,但是当接入OpenVRLoader 时无法正常通过Openvr_xr_plugin去获取设备的输入输出。 2、Openxr 和OpenVRLoader同时打开也还是会没有输入信息。 3、我们需要修改com.unity.xr.interaction.toolkit插件代码,不能直接用packmanage的将插…

从零开始的职场攻略,我是如何成为优秀活动策划的?

想要提升活动策划能力,成为活动操盘手,除了避免踩坑之外,你还需要额外掌握以下 4 项能力。当你持续向着这几个方向提高的时候,你可以感受到作为活动策划带来的成就感,甚至你的整个职业生涯都能够因此迎来一个飞跃。 1…

突破数据边界,开启探索之旅!隐语开源Meetup一周年专场7月22日上海见

小伙伴们,📢「隐语开源一周年 Meetup 」即将来袭!🎉在一周年 Meetup 上,不仅会对隐语 1.0 版本进行详解,还有新鲜出炉的隐语 MVP 部署体验包,让你秒变高手!更有机会与隐私计算行业的…

10年软件测试工程师感悟——写给还在迷茫的朋友

这两天和朋友谈到软件测试的发展,其实软件测试已经在不知不觉中发生了非常大的改变,前几年的软件测试行业还是一个风口,随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业,目前软件测试行业“缺口”已经基本饱和。当然&a…

若依前端项目理解

官网:RuoYi 一、目录结构 一级目录:通过vue3.0及以后版本创建的项目文件 二级目录(src文件): ruoyi-ui(前端文件夹) bin文件夹(批处理文件,打包、运行) bui…

k8s部署springboot

前言 首先以SpringBoot应用为例介绍一下k8s的部署步骤。 1.从代码仓库下载代码,比如GitLab; 2.接着是进行打包,比如使用Maven; 3.编写Dockerfile文件,把步骤2产生的包制作成镜像; 4.上传步骤3的镜像到远程…

MySql基础知识及数据查询

目录 第一章 数据库概述 1.为什么要学习数据库? 2.数据库的相关概念 3.ORM(Object Relational Mapping)思想 4.表与表的记录之间存在哪些关联关系 第二章 基本的SELECT语句 1.SQL的分类 2. SQL基本规则 3.导入现有的数据表、表的数据 4.最基本的…

全网最牛,打通接口自动化测试框架详细,一篇足够

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口自动化测试开…

原型设计用得最多的是PS吗?该如何画原型?

在产品开发的前期工作中,产品经理或设计师通常需要进行原型设计工作,创建一个可交互和可视化的原型,以更准确地表达他们的设计构思和想法,并为项目顺利递交给开发人员做好准备。进行原型设计时,使用设计工具来画原型图…

计算机常识

文章目录 1. 计算机存储单位换算2. 为什么我买的256内存,实际不足256内存?3. 32位和64位操作系统支持内存 1. 计算机存储单位换算 1Byte 8bit 1KiB 1024 Byte 1MiB 1024 KiB 1048576 Byte 1GiB 1024 MiB 1TiB 1024 GiB 2. 为什么我买的256内存&a…

2023.07.04 homework

到高中前,大多数都还算可以,大多数娃娃主要还是兴趣和学习细节问题

SciencePub学术 | 计算机综合类重点SCIE征稿中

SciencePub学术 刊源推荐: 计算机综合类重点SCI&EI征稿中!进展顺利、极速录用。信息如下,录满为止: 一、期刊概况: 计算机综合重点SCIE 【期刊简介】IF:1.0-1.5,JCR4区,中科院4区&#xf…

Neighborhood Contrastive Learning for Novel Class Discovery (CVPR 2021)

Neighborhood Contrastive Learning for Novel Class Discovery (CVPR 2021) 摘要 在本文中,我们解决了新类发现(NCD)的问题,即给定一个具有已知类的有标签数据集,在一组未标记的样本中揭示新的类。我们利用ncd的特性构建了一个新的框架&am…

setContentView DecorView Activity生命周期

DecorView DecorView是Android中的一个重要类,它是View系统的根View,用于承载应用程序的所有视图层级。下面是一些关于DecorView的信息和相关链接: 1、DecorView是Android系统中的顶级View,它是Window的根视图,负责显…

排序算法解析

常见的排序算法包括以下几种: 冒泡排序(Bubble Sort):重复比较相邻的两个元素,将较大的元素逐渐向后移动,直到整个序列有序。 选择排序(Selection Sort):从未排序部分选…

Nginx负载均衡、虚拟主机

目录 常用的6种负载均衡算法 轮询算法(round robin)默认 权重(weight) 响应时间(fair) 连接数(least_conn) IP_hash url_hash(第三方) 开发优选:一致性哈希 安装步骤: 虚拟主机 常用的6种负载均衡算法 轮询算法(round robin)默认 轮询方式&a…

MMaction2 使用记录1——训练及测试

目录 训练及测试 Training 在你的 PC上训练 Training 多 GPUs Test 训练及测试 Training 在你的 PC上训练 你可以使用tools/train.py在一台有CPU和可选GPU的机器上训练一个模型。 下面是该脚本的完整用法: python tools/train.py ${CONFIG_FILE} [ARGS] 默…

基于Java出租车管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

2023RPA最佳实践案例之:实在智能助力杭州银行打造数字员工智能辅助平台

导语: 近期,实在智能荣登"2023爱分析RPA最佳实践案例"榜单。此次评选活动旨在表彰在RPA领域具备实践领先性、案例创新性、应用成熟度、价值创造等优点的企业和厂商,实在智能以其为杭州银行打造的RPA数字员工解决方案作为目前 RPA …