uvloop —— 超级快的 Python 异步网络框架

简介:

简短介绍

asyncio是遵循Python标准库的一个异步 I/O框架.在这篇文章里,我将介绍 uvloop: 可以完整替代asyncio事件循环.uvloop是用Cython写的,基于 libuv.

uvloop 使得 asyncio 更快. 实际上,比nodejs,gevent,以及其他任何Python异步框架至少快两倍 .uvloop asyncio 基于性能的测试接近于Go程序.

asyncio 和 uvloop

asyncio 模块, 是在 PEP 3156引入的, 是一个集合,包含网络传输, 协议, 和抽象的流, 带有可插拔的事件循环. 事件循环是asyncio的核心.它提供如下API:

  • 调用方法的调度
  • 通过网络传输数据
  • 执行 DNS 查询,
  • 处理 OS 操作系统信号
  • 对创建服务器和连接进行封装
  • 子进程异步处理

目前 uvloop 只支持 *nix 平台和 Python 3.5。

uvloop 是 Python 内建的 asyncio 事件循环的替代品,你可以通过 pip 来安装:


 
 
  1. $ pip install uvloop 

在你的 asyncio 代码中使用 uvloop 非常简单:


 
 
  1. import asyncio 
  2. import uvloop 
  3. asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) 

上面的代码片段让 asyncio.get_event_loop() 返回一个 uvloop 的实例。

你还可以显式的创建一个uvloop实例,通过调用uvloop.new_event_loop()。

体系结构

uvloop是用Cython编写的,并建立在libuv之上。

libuv是一种高性能的、跨平台异步的 I/O 类库,nodejs也使用到了它。由于nodejs是如此的广泛和流行,可以知道libuv是快速且稳定的。

uvloop 实现了所有的asyncio 事件循环APIs。高级别的Python对象包装了低级别的libuv 结构体和函数方法。 继承可以使得代码保持DRY(不要重复自己),并确保任何手动的内存管理都可以与libuv的原生类型的生命周期保持同步。

基准测试

与其它实现相比,为了检测uvloop栈性能,我们创建了toolbench基准测试,用于标准的TCP和UNIX套接字I/O,和HTTP协议性能的基准 。

基准测试服务器运行在一个包含外部负载生成工具 (wrk HTTP 基准测试)的Docker容器内,它测试请求吞吐量与延迟。

这篇博客中所有的基准测试都运行于Intel Xeon CPU E5-1620 v2 @ 3.70GHz的 Ubuntu Linux系统.我们使用的是Python 3.5,所有服务器都是单核. 此外,Go代码中使用了GOMAXPROCS=1 ,nodejs没有使用集群,并且所有的Python服务器都是单线程.每一个基准测试集都设置了TCP_NODELAY标识。

在Mac OS X上的基准报告结果也很相似。

TCP

这个基准测试使用不同的消息数目对一个简单的回显服务器的性能进行了测试。我们分别使用了1, 10, 和100 KiB 的包。并发级别是10。每一个基准运行了30秒。

可以点击这里查看完整的TCP基准报告。

每个位置的一些意见:

  1. asyncio-streams。 asyncio 和其内置的纯Python实现的事件循环。在这个基准测试中,我们测试了高级别的流的抽象的性能。我们使用asyncio.create_server()来创建一个服务器,把一对(reader, writer) 传递给客户端协同程序.
  2. tornado。 这个服务器实现了一个非常简单的Tornado 协议,它能够把收到的消息立即回复回去。
  3. curio-streams。 Curio是Python aio 库上的新成员。 与asyncio-streams类似,在这个基准测试中,我们测试了curio 流,使用curio.make_streams()来创建了一对(reader, writer),它提供了一些高级的API,如readline()。
  4. twisted。 跟Tornado类似,我们测试了一个最小的回声协议。
  5. curio。这个基准测试测试了curio 套接字的性能:这是一个实现了sock.recv() 和 sock.sendall()紧密循环的协同程序。
  6. uvloop-streams。就如在#2中提到的,这里我们测试了asyncio高级流的性能,只不过这此时基于uvloop。
  7. gevent。在一个紧密循环里通过使用gevent.StreamServer和一个gevent套接字发送接受数据。
  8. asyncio。看起来普通的asyncio非常的快速!跟第2和4点类似,我们测试了一个最小的回声协议,它是使用纯Python的asyncio所实现的。
  9. nodejs。我们使用net.createServer API 在nodejs v4.2.6里测试流的性能。
  10. uvloop。这个基准测试测试了一个最小的回声协议(就如 #2, #4, #8),它是使用基于uvloop的asyncio实现的。 使用1 KiB消息的情况下,uvloop是最快的实现,可以高达每秒钟105,000的请求!使用100 KiB消息的情况下, uvloop的速度可以达到大概2.3 GiB/s。
  11. Go。一个 net.Conn.Read/Write 调用的紧密循环。 Golang 性能跟uvloop非常接近,在10 和100 KiB消息情况下会稍微好一些。

所有的基准测试的代码可以在这里找到。

也可以查看所有的UNIX套接字基准测试结果。

HTTP

最初,我们想要在asyncio和uvloop上针对nodejs和Go进行测试。aiohttp是使用asyncio编写异步HTTP服务器和客户端 最流行的框架。

也可以查看完整的HTTP基准测试报告。

然而,aiohttp 上的性能瓶颈确实其HTTP解析器,它比较慢,因此即使使用的I/O类库再快也没什么卵用。为了让事情更有趣,我们为 http-parser (nodejs的 HTTP 解析器C类库,最初是为Nginx研发的) 创建了一个Python绑定(binding)。这个类库被命名为httptools,并且在Github和PyPI都可以找到。

对于HTTP,所有的基准使用wrk 来生成负载。 并发级别设置为300。每个基准的持续时间为30秒。

令人惊奇的是,纯Python实现的asyncio在高性能的HTTP解析器的帮助下,比使用同样HTTP解析器的nodejs表现的快很多!

Go在1 KiB响应情况下要更快些,但是uvloop和asyncio的组合却在10/100 KiB响应情况下要快很多。使用httptools的asyncio和uvloop的服务质量非常棒,对于Go来说也一样。

不可否认,基于httptools的服务器非常的小巧,而且不像其他实现那样不包含任何路由逻辑。尽管如此,这个基准却演示了uvloop和一个高效实现的协议配合能变得多么快速。

Conclusion

我们可以得出结论, 利用uvloop可以写出在单CPU内核下每秒钟能够发出上万个请求的Python网络代码。 在多内核系统下,可以使用进程池来进一步来改善系统性能。

uvloop 和 asyncio,在加上Python 3.5里 async/await的强大能力,使得使用Python编写高性能的网络代码更容易了。


本文作者:佚名

来源:51CTO

相关文章
|
6天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
115 55
|
16天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
97 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
6天前
|
机器学习/深度学习 算法 PyTorch
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
本文探讨了图神经网络(GNN)与大型语言模型(LLM)结合在知识图谱问答中的应用。研究首先基于G-Retriever构建了探索性模型,然后深入分析了GNN-RAG架构,通过敏感性研究和架构改进,显著提升了模型的推理能力和答案质量。实验结果表明,改进后的模型在多个评估指标上取得了显著提升,特别是在精确率和召回率方面。最后,文章提出了反思机制和教师网络的概念,进一步增强了模型的推理能力。
24 4
基于图神经网络的大语言模型检索增强生成框架研究:面向知识图谱推理的优化与扩展
|
5天前
|
JSON 数据可视化 测试技术
python+requests接口自动化框架的实现
通过以上步骤,我们构建了一个基本的Python+Requests接口自动化测试框架。这个框架具有良好的扩展性,可以根据实际需求进行功能扩展和优化。它不仅能提高测试效率,还能保证接口的稳定性和可靠性,为软件质量提供有力保障。
23 7
|
2天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
15 2
|
24天前
|
人工智能 自然语言处理
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
WebDreamer是一个基于大型语言模型(LLMs)的网络智能体框架,通过模拟网页交互来增强网络规划能力。它利用GPT-4o作为世界模型,预测用户行为及其结果,优化决策过程,提高性能和安全性。WebDreamer的核心在于“做梦”概念,即在实际采取行动前,用LLM预测每个可能步骤的结果,并选择最有可能实现目标的行动。
52 1
WebDreamer:基于大语言模型模拟网页交互增强网络规划能力的框架
|
16天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
42 3
|
18天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
18天前
|
数据采集 JSON 测试技术
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
28 3
|
21天前
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
36 6
下一篇
DataWorks