首页 > 编程知识 正文

一加7T完美解决wifi断流(shifthappens直接ip联机)

时间:2023-05-04 22:41:09 阅读:86405 作者:349

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

Asyncio是Python标准库中的异步I/O框架。 本文介绍了基于Cython创建的libuv构建的uvloop——完整asyncio事件周期的替代品。

Uvloop使异步io速度更快。 实际上,它至少是Nodejs、Gevent或其他Python异步框架速度的两倍。 Uvloop的性能可以与用Go编写的项目媲美。

Asynciouvloop

PEP 3156中对Asyncio模块进行了说明。 Asyncio模块是一系列网络传输、协议和流抽象的集合,其本身提供了插件事件循环,事件循环是Asyncio的中心内容。 主要提供以下API :

的FTP服务器连接设置

藉由互联网传输数据

执行DNS查询

处理操作系统信号

轻松创建服务和连接

异步使用子流程

Uvloop是内置异步io事件周期的替代品,可以用pip安装Uvloop。

将uvloop应用于asyncio代码也很容易。

根据上面的代码,asyncio.get_event_loop_policy返回了一个uvloop的实例。

架构

uv环路由Cython编写,基于Libuv。

Libuv是nodejs中使用的高性能、跨平台异步I/O库,由于nodejs的广泛使用和流行,Libuv非常稳定、高速。

Uvloop实现了所有asyncio的事件循环API,上层的Python对象包含了下层的libuv数据结构和函数。 通过使用继承来确保代码的清洁,并确保手动内存管理与libuv原语的生命周期同步。

为了实现

基准

UVloop与其他工具的性能竞争,我们创建了一个基于TCP、UNIX套接字I/o和HTTP协议性能的工具。

基准测试服务在Docker容器中运行,并在外部使用负载测量工具计算请求数和延迟数据。 在HTTP上使用了wrk。

所有测试数据集都在英特尔至强CPU E5-1620 v2 @ 3.70 GHz的Ubuntu计算机上运行。 我们使用Python 3.5,所有服务都是单线程的。 此外,对于Go代码,设定了GOMAXPROCS=1,nodejs也没有使用集群模式。 所有的Python服务都在单进程中设置了TCP_NODELAY标志位。

对Mac OS X系统的测试数据也显示了同样的结果。

TCP

测试数据集测量的是一台服务器处理不同消息量时的性能,分别使用1、10和100Kib的数据包,并发量为10,每个测试集运行30秒

评论:

1、异步io -流。 Asyncio及其内置Python创建的事件循环测试了高维数据流抽象的性能。 您使用asyncio_create_server创建了一个服务。 该服务将配对(reader、writer )传递给客户端程序。

2、tornado 该服务器实现了简单的Tornado协议,在收到数据后立即返回数据。

3、curio-streams Curio是Python的新aio库,与asyncio-streams相似。 我们主要使用curio.make_streams来创建和测试对(reader,writer )。

4、扭曲。 与Tornado类似,但只测试简单的echo协议。

五、curio。 本测试集测试了curio sockets重用sock.recv和sock.sendall的性能。

6、紫外线环路流。 在这里,我们测试了asyncio的高级流数据的性能,并基于uvloop进行了测试。

7、gevent 使用gevent.stream服务器和gevent套接字发送和接收数据。

8、异步IO。 vanilla asyncio似乎很快! 和2和4一样,这里使用纯python aysncio测试echo协议。

9、节点。 我们使用Net.createServer API测试了nodejs 4.2.6版的流式数据的性能。

十、UV环路。 在本测试集中,我们将介绍基于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,结合python 3.5中的async/await,可以更容易的用python编写出更高效的代码。

你可以尝试下uvloop并将结果与我们分享!

英文原文:http://magic.io/blog/uvloop-make-python-networking-great-again/ 译者:dlgao

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。