Python协程asyncio异步编程结合uvloop性能提升

news2024/11/23 15:24:54

asyncio介绍

  • 和我们以前常用的gevent模块相似,asyncio模块也是在Python中实现协程的模块
  • 区别是gevent是第三方库,通过greenlet实现协程,遇到I/O自动切换(自动挡)
  • asyncio是Python 3.4版本引入的标准库,asycio 需要自己在代码中让出CPU,控制权在自己手上(手动挡)
  • asyncio是原生协程关键字:Async和Await,它们的底层基于生成器函数
     

uvloop介绍

  • uvloop 是python圈子里近两年被抄的相当火热的高性能框架,uvloop是个高性能的异步非阻塞框架,他是完整的asyncio事件循环的替代品,建立在libuv基础之上,由Cython编写而成。Uvloop最终目的使得Asyncio更加快速。   
  • 根据我个人的测试结果分析uvloop性能确实要比gevent要高,但是易用性没有gevent来的舒服。python sanic也是基于uvloop实现的异步io,但总的来说uvloop的相关资料、实例都有些欠缺。

测试结论

这不是我做的,我只是转发一下uvloop官方测试结果。

分为两种测试:TCP协议和HTTP协议。

TCP

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

分别用1KiB数据包、10KiB、100KiB做了测试。

可以看到uvloop确实牛逼,性能直逼Go。 

HTTP

解释下:官方人员本来想用aiohttp这个Python中最常用的异步http服务库测试的。但是它的http解析器效率太低了,已然成为整个系统的瓶颈,所以他们手动实现了http-parser(起初是为Nginx设计的,所以效率非常高)的Python版本,称之为httptools。 

可以看到,asyncio原生事件循环和uvloop,对aiohttp没有性能提升!(看完后,我想:以后不敢用aiohttp了)

而把http解析器这个瓶颈解决掉后,asyncio原生事件循环和uvloop性能都明显提升,但uvloop明显更牛逼,在10KiB和100KiB场景下,性能超越了Go。

uvloop缺点

暂不支持Windows

安装

pip3 install uvloop

使用方法

import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
loop = asyncio.get_event_loop()

...

其它async代码不变,你就享受到了更快的事件循环!

个人总结

如果一味追求性能,还是直接用Go吧。

但是uvloop确实给Python开发者提供了更强的性能,对于Python开发者很爽。但是也要注意,有没有其它性能瓶颈,例如跟aiohttp结合使用时,瓶颈可能在于http解析。

官方参考文献

uvloop: Blazing fast Python networking — magicstack

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

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

相关文章

GitHub访问问题与FastGithub下载及使用(详细篇)

前言 📜 “ 作者 久绊A ” 专注记录自己所整理的Java、web、sql等,IT技术干货、学习经验、面试资料、刷题记录,以及遇到的问题和解决方案,记录自己成长的点滴 目录 前言 FastGithub的介绍 FastGithub的下载 FastGithub的安装及…

23种设计模式之综合实战篇

23种设计模式之综合实战篇1. 设计模式概述1.1 什么是设计模式1.2 设计模式的好处2. 设计原则分类3. 详解3.1 单一职责原则3.2 开闭原则3.3 里氏代换原则3.4 依赖倒转原则3.5 接口隔离原则3.6 合成复用原则3.7 迪米特法则4. Awakening1. 设计模式概述 我们的软件开发技术也包括一…

微刊:做了很多的16S三代测序,文章可以这样写~

三代的黄金时代已经来临!在扩增子方面与二代相比其优势明显:1:获得的序列更长,信息量更多更准确!2;鉴定高精准,“种”水平物种鉴定中实现了大幅提升。3:PCR扩增无GC偏好性,数据更准确。4:V1-V9全…

MySQL多表操作的外键约束

目录 一.多表关系 一对一关系 一对多/多对一关系 多对多关系 二.外键约束 特点 创建外键约束 方式1-在创建表时设置外键约束 方式2-在创建表时设置外键约束 在外键约束下的操作 1.数据插入 2.删除数据 3.删除外键约束 外键约束-多对多关系 操作 一.多表关系 MySQL多表…

51单片机学习笔记-12LCD1602液晶屏

12 LCD1602液晶屏 [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注:工程及代码文件放在了本人的Github仓库。 12.1 LCD1602介绍 LCD1602(Liquid Crystal Display)…

【Java 数据结构】实现一个二叉搜索树

目录 1、认识二叉搜索树 2、实现一个二叉搜索树 2.1 成员变量 2.2 insert 方法 2.3 search 方法 2.4 remove 方法(重点) 3、二叉搜索树总结 1、认识二叉搜索树 从字面上来看,它只比二叉树多了搜索两个字,我们回想一下,如果要是在二…

linux性能优化-CPU上下文切换

疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高? 因为存在CPU上下文切换。 linux系统说明 Linux是一个多任务操作系统,它支持远大于CPU数量的任务同时运行。当然,这些任务实际上并不是真的在同时…

pytorch-lightning中使用wandb实现超参数搜索

由于最近涉及下游任务微调,预训练任务中的框架使用的是pytorch-lightning,使用了典型的VLP(vision-language modeling)的训练架构,如Vilt代码中:https://github.com/dandelin/ViLT,这类架构中只涉及到预训练&#xff0…

51单片机学习-5定时器与中断

5 定时器与中断 [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注:工程及代码文件放在了本人的Github仓库。 5.1 定时器原理与中断系统 5.1.1 定时器原理 CPU的时序指标有: 振…

C语言预处理命令是什么?

C语言源文件要经过编译、链接才能生成可执行程序:1) 编译(Compile)会将源文件(.c文件)转换为目标文件。对于 VC/VS,目标文件后缀为.obj;对于GCC,目标文件后缀为.o。编译是针对单个源…

ESP32设备驱动-ADS1015(ADC)驱动

ADS1015(ADC)驱动 1、ADS1015介绍 ADS1015 是一款具有 12 位分辨率的精密模数转换器 (ADC),采用超小型无引线 QFN-10 封装或 MSOP-10 封装。 ADS1015 的设计考虑了精度、功率和易于实施。 ADS1015 具有板载基准和振荡器。 数据通过 I2C 兼容的串行接口传输; 可以选择四个 I…

Portapack应用开发教程(十八)NavTex接收 C

有段时间没研究NavTex了,这段时间打算捡起来继续搞。 上一篇文章中,我用frisnit生成了wav文件。然后再用gnuradio观察波形,发现波形确实能与frisnit中的描述以及python解码程序中的dictionary对应上。 接下来,我要重点想办法自己…

Rust机器学习之petgraph

Rust机器学习之petgraph 图作为一种重要的数据结构和表示工具在科学和技术中无处不在。因此,许多软件项目会以各种形式用到图。尤其在知识图谱和因果AI领域,图是最基础的表达和研究工具。Python有著名的NetworksX库,便于用户对复杂网络进行创…

apt命令详解

apt(Advanced Packaging Tool)是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器。 apt 命令提供了查找、安装、升级、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。 apt 命令执行需要超级管理员权限(root)。前些日子…

基于java ssm springboot宠物用品商城系统

基于java ssm springboot宠物用品商城系统 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…

Python 基础语法介绍(一)

文章目录一、概述二、变量1)变量定义2)定义变量的规则3)变量命名规范4)变量类型转换三、注释1)单行注释2)多行注释1、单引号()注释2、双引号("""&#xf…

Kubernetes 体验 kubecolor

Kubernetes 体验 kubecolorkubecolor 概述Github 地址安装 kubecolor设置.bashrc使用 kubecolorkubecolor 概述 对你的kubectl输出进行着色。 kubecolor在内部调用kubectl命令并尝试对输出进行着色,因此你可以将kubecolor作为kubectl的一个完整的替代品。这意味着…

JAVA经典面试题带答案(一)

目录 1、JDK 和 JRE 有什么区别? 2、 和 equals 的区别是什么? 3、final 在 java 中有什么作用? 4、java 中的 Math.round(-1.5) 等于多少? 5、String 属于基础的数据类型吗? 不属于。 6、String str"i&quo…

51单片机学习笔记-13直流电机

13 直流电机 [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注:工程及代码文件放在了本人的Github仓库。 13.1 直流电机与PWM波 13.1.1 直流电机 直流电机是一种将电能转换为机械能的装置…

Docker -- 部署Mysql主从服务

以下是配置一主两从的Mysql服务的具体流程。 文章目录创建用于挂载的目录修改cnf配置拉取mysql服务镜像自定义docker网络启动容器主库配置查看主库状态创建从库备份用户从库配置修改Master信息启动slave服务查看slave服务状态是否正常创建用于挂载的目录 保证数据的持久化&…