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:

第 1 段(可获 1.41 积分)

負愚侕歸 1年前

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

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

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

$ pip install uvloop

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

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

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

第 2 段(可获 0.96 积分)

CY2 2年前

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

体系结构

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

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

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

第 3 段(可获 1.09 积分)

班纳睿 9个月前

基准测试

与其它实现相比,为了检测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标识。

第 4 段(可获 1.33 积分)

負愚侕歸 1年前

在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消息情况下会稍微好一些。

第 5 段(可获 3.96 积分)

班纳睿 9个月前

如何阅读盒图:(此处为一图,原文丢失,未带过来)

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

也可以查看所有的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都可以找到。

第 6 段(可获 1.54 积分)

班纳睿 9个月前

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

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

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

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

第 7 段(可获 1.39 积分)

班纳睿 9个月前

Conclusion

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

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

请试用下uvloop (github) 并分享下使用结果吧!

原文地址:https://www.cnblogs.com/yanzi-meng/p/8459689.html

时间: 2024-10-10 21:03:16

uvloop —— 超级快的 Python 异步网络框架的相关文章

超级快的python vibora.io框架

https://vibora.io/ Vibora代表葡萄牙语的viper,它是一个异步的客户端/服务器框架,要成为最快的Python HTTP客户端/服务器框架,支持Python 3.6+以上版本! 该框架效率高,性能好.它的API灵感来自Flask,而其内置功能基于众多著名的库,如jinja2,marshmallow,aaugustin的websockets,werkzeug等等. 为什么异步?正如其官方所提到的,“Web API通常是基于I/O的,而这正是异步架构的优势所在.” Vibor

python2.0_s12_day10_Twsited异步网络框架

Twsited异步网络框架 Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等. Package application Configuration objects for Twisted Applications Package conch Twisted Conch:The Twisted Shell.Terminal emulation,SSHv2 and telnet Module copyright Copyright i

基于redis AE的异步网络框架

最近一直在研究redis的源码,redis的高效率令人佩服. 在我们的linux机器上,cpu型号为, Intel(R) Pentium(R) CPU G630 @ 2.70GHz Intel(R) Pentium(R) CPU G630 @ 2.70GHz 上 set,get 都能达到每秒钟15W的请求处理量,真是佩服这代码的效率. 前几篇文章,主要是介绍了基本的代码,比如字符串处理,链表处理,hash等.这篇文章介绍网络的核心,基于事件反映的异步网络框架. 异步网络处理,是基于epoll的.

Voovan 是一个高性能异步网络框架和 HTTP(Java)

Voovan 是一个高性能异步网络框架和 HTTP 服务器框架,同时支持 HTTP 客户端抓取.动态编译支持.数据库访问封装以及 DateTime.String.Log.反射.对象工具.流操作.文件操作.异步双向通道等功能.旨在提供可靠.方便.可单元测试的代码.它是一个无任何依赖的独立工具包,希望能够方便广大开发者快速的实现应用. 作者:@愚民日记 地址:http://git.oschina.net/helyho/Voovan http://www.oschina.net/news/80909/

Twsited异步网络框架

Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等. Twisted介绍:http://blog.csdn.net/hanhuili/article/details/9389433 事件驱动 简而言之,事件驱动分为二个部分:第一,注册事件:第二,触发事件. 自定义事件驱动框架,命名为:“弑君者”: #!/usr/bin/env python # -*- coding:utf-8 -*- # event_drive.py event_

greenev —— Python 异步网络服务框架

greenev是一个基于greenlet协程,事件驱动,非阻塞socket模型的Python网络服务框架,它使得可以编写同步的代码,却得到异步执行的优点. 本项目受到gevent, openresty, alilua, skynet, clowwindy/ssloop的启发,在此表示感谢. reactor模式采用基于epoll, kqueue, poll, select的IO复用机制 基于底层的reactor完成上层greenlet协程的调度 在CentOS6.5, Ubuntu12.04, F

理解Twsited异步网络框架

事件驱动 简而言之,事件驱动分为二个部分:第一,注册事件:第二,触发事件.自定义事件驱动框架,命名为:“弑君者”: 事件服务器端: 1 __author__ = 'lizheng' 2 # !/usr/bin/env python 3 #-*- coding:utf-8 -*- 4 event_list = [] 5 6 def run(): 7 for event in event_list: 8 obj = event() 9 obj.execute() 10 11 12 class Bas

<史上最强>深入理解 Python 异步编程(上)

前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知道如何使用 Tornado.Twisted.Gevent 这类异步框架上,出现各种古怪的问题难以解决.而且使用了异步框架的部分同学,由于用法不对,感觉它并没牛逼到哪里去,所以很多同学做 Web 后端服务时还是采用 Flask.Django等传统的非异步框架. 从上两届 PyCon 技术大会看来,异步编程已经成了 Python 生态下一阶段的主旋律.如新兴的 Go.Rust.

深入理解 Python 异步编程(上)

http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知道如何使用 Tornado.Twisted.Gevent 这类异步框架上,出现各种古怪的问题难以解决.而且使用了异步框架的部分同学,由于用法不对,感觉它并没牛逼到哪里去,所以很多同学做 Web 后端服务时还是采用 Flask.Django等传统的非异步框架. 从上两届 PyCon 技术大会看来,异步编程已经成