当前位置

首页 > 热门IT语言 > Python > Asyncio&uvloop

Asyncio&uvloop

编辑:光环大数据 来源: 互联网 时间: 2017-10-31 13:42 阅读:

  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培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服

你可能也喜欢这些

在线客服咨询

领取资料

X
立即免费领取

请准确填写您的信息

点击领取
#第三方统计代码(模版变量) '); })();
'); })();