Asyncio&uvloop
Asyncio&uvloop。PEP3156中介绍了Asyncio模块,它是一系列网络传输,协议及流抽象的集合,本身提供了插件式事件循环,并且事件循环就是asyncio的核心内容。它主要提供了如下API:
进行调用调度
藉由网络传输数据
执行DNS查询
处理OS信号
方便地创建服务和连接
异步使用subprocess
Uvloop是内置asyncio事件循环的替代品,你可以通过pip来安装uvloop。
在asyncio代码中应用uvloop也非常简单。
上述的代码使得asyncio.get_event_loop_policy返回了一个uvloop的实例。
架构
Uvloop是由Cython编写,建立在Libuv基础之上。
Libuv是nodejs中使用到的一个高性能,跨平台的异步I/O库,由于它nodejs的广泛使用和受欢迎程度,因而libuv是非常稳定和快速的。
Uvloop实现了所有的asyncio的事件循环API,高层的Python对象包裹了底层的libuv数据结构和函数。通过使用继承来保证代码的整洁,并且确保了任何人工干预的内存管理都与libuv原语的生命周期同步。
基准
为了进行uvloop与其他工具的性能较量,我们创建了一个工具用来对TCP、UNIXsocketsI/O及HTTP协议的性能进行基准测试。
基准测试服务运行在一个Docker容器中,外部使用了负载测量工具(HTTP中使用了wrk)以便计算请求数及延迟数据。
所有测试数据集都运行在一台IntelXeonCPUE5-1620v2@3.70GHz的Ubuntu机器上,我们使用了Python3.5并且所有的服务都是单线程的。另外,对于Go代码我们设置了GOMAXPROCS=1,nodejs也未使用集群模式,所有的Python服务都是单进程而且设置了TCP_NODELAY标志位。
对于MacOSX系统测试数据也显示出了相似的结果。
TCP
这个测试数据集检测了单台服务器处理不同消息量时的性能表现,我们分别使用了1,10和100Kib的数据包,并发量为10,每一个测试集运行了30秒。
备注:
1、asyncio-streams。Asyncio和它内置Python编写的事件循环,我们测试了高阶数据流抽象的性能。我们使用了asyncio_create_server()来创建一个服务,它会传递一对(reader,writer)给客户端程序。
2、tornado。该服务实现了一个简单的Tornado协议,会在收到数据后立刻将数据返回。
3、curio-streams。Curio是Python中一种新的aio库,与asyncio-streams类似,我们主要使用curio.make_streams()创建一对(reader,writer)来测试。
4、twisted。和Tornado类似,我们仅仅测试简单的echo协议。
5、curio。该测试集测试了curiosockets的性能:循环使用sock.recv()和sock.sendall()。
6、uvloop-streams。这里我们测试了asyncio的高层次流数据的性能,而且是基于uvloop来做。
7、gevent。通过使用gevent.StreamServer和gevent的socket来发送、接收数据。
8、asyncio。看起来vanillaasyncio非常快速!和2和4类似,我们这里使用纯粹的pythonaysncio来测试echo协议。
9、nodejs。我们使用Net.createServerAPI来测试nodejs4.2.6版本的流数据性能。
10、uvloop。这个测试集测试了基于uvloop由asyncio实现的echo协议(像#2,#4,#8)一样。在1KiB消息量的情况下,uvloop是最快速的工具,能够每秒接收105,000个请求!对于100KiB的消息量,uvloop可以每秒通过2.3GiB。
11、Go。通过net.Conn.Read/Write调用,Golang性能非常接近于uvloop,在10和100KiB消息量时略微好些。
HTTP
起初,我们想在asyncio、uvloop以及Nodejs和Go上测试aiohttp的性能,aiohttp是使用asyncio编写异步HTTP服务的最流行的框架。
然而,aiohttp的性能瓶颈出现在它的HTTP解释器上,它非常慢,因此和底层的I/O库并没有太大的关系。为了让事件更有趣,我们创建了一个python绑定的HTTP解释器(nodejs的HTTP解释器,起初为了Nginx而设计)。这个库叫做Httptools,在Github和PyPI上都能找到。
对于HTTP来说,所有的测试集都用wrk来收集负载情况,并发级别设置为300,每次的持续时间为30秒。
非常惊奇的是,纯Python的asyncio在高性能的HTTP解释器帮助下速度超过了nodejs,而它们使用的是相同的HTTP解释器!
在1KiB响应量情况下Go会快一些,但是uvloop+asyncio在10/100KiB的响应量时会表现的更好。对于asyncio和uvloop来说,有了Httptools服务的质量就非常棒,对于Go也是同理。
诚然,基于httptools的服务都相当的小,不包含相应的路由逻辑,这点不像其他的实现那样。尽管如此,这个测试集反应了uvloop在高效协议的帮助下是非常快速的。
结论
对于uvloop,可以肯定地说,我们可以利用它编写出在单核CPU中承载每秒数以万计请求的代码,在多核系统上,利用进程池可以更好地扩展其性能。
Uvloop和asyncio,结合python3.5中的async/await,可以更容易的用python编写出更高效的代码。
你可以尝试下uvloop并将结果与我们分享!
Python培训、Python培训班、Python培训机构,就选光环大数据!
还不够过瘾?想学习更多?点击 http://hadoop.aura.cn/python/ 进行Python学习!
大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服!