首页 > 编程知识 正文

python ai框架(多线程爬虫)

时间:2023-05-06 09:45:38 阅读:86402 作者:4107

uvloop ——超高速Python异步网络框架

同步io是一种符合Python标准库的异步I/O框架。 本文介绍了uvloop:可以完全代替asyncio事件循环。 uvloop由Cython编写,基于libuv.uvloop使异步io速度更快。 实际上,比nodejs

简单介绍

同步io是一种符合Python标准库的异步I/O框架。 本文介绍了uvloop:完全可以代替asyncio事件循环。 uvloop由Cython编写,基于libuv。

uvloop将加快异步io的速度。 实际上,它比nodejs、gevent和其他Python异步框架至少快两倍。 uvloop asyncio基于性能的测试接近于Go计划。

同步io和紫外线环路

asyncio模块由PEP 3156引入,是一个包含网络传输、协议和抽象流的集合,包含可插入的事件循环。 事件循环是asyncio的核心,提供以下API:

调用方法的调度通过网络传输数据来执行DNS查询,并异步处理封装的子进程以处理OSOS信号和创建服务器和连接。 目前,uvloop仅支持*nix平台和Python 3.5。

uvloop是内置于Python中的异步io事件周期的替代品,可以通过pip进行安装。

$ pip install uvloop在您的异步代码中使用uvloop非常简单:

importasyncioimportuvloopasyncio.set _ event _ loop _ policy (uv loop.eventlooppolicy () ) ) ) )上的代码片段) )上的代码片段

也可以通过调用uvloop.new_event_loop ()来显式创建uvloop实例。

体系结构

uvloop由Cython编写,构建在libuv之上。

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

uvloop实现了所有的异步io事件循环APIs。 较高级别的Python对象包装了较低级的libuv结构和函数方法。 继承使代码保持DRY状态,并允许手动内存管理与libuv的本机类型生命周期同步。

基准测试

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

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

该博客的所有基准测试都在Intel Xeon CPU E5-1620 v2 @ 3.70GHz的Ubuntu Linux系统上运行。 我们使用Python 3.5,所有的服务器都是单核。 此外,Go代码使用GOMAXPROCS=1,而nodejs不使用群集。 另外,所有的

Mac OS X上的基准测试结果也非常相似。

国际电信联盟

在这个基准测试中,我们用不同的消息数测试了简单的回波服务的性能。 我们分别用了110100 kib的包。 同时性水平为10。 各标准运转了30秒。

单击此处可查看完整的TCP基准报告。

各地点的意见:

异步io流。 asyncio及其内置的纯Python实现的事件循环。 该基准测试了更高级别的流的抽象性能。 使用asyncio.create_server ()创建服务器,并将对(reader,writer )传递给客户端协作器. tornado。 该服务器实现了非常简单的Tornado协议,可以立即回复收到的消息。 Curio -串流。 Curio是Python aio库的新成员。 与asyncio-streams一样,该基准测试了curio流,并使用curio.make_streams ()创建了一对

(reader, writer),它提供了一些高级的API,如readline()。twisted。 跟Tornado类似,我们测试了一个最小的回声协议。curio。这个基准测试测试了curio 套接字的性能:这是一个实现了sock.recv() 和 sock.sendall()紧密循环的协同程序。uvloop-streams。就如在#2中提到的,这里我们测试了asyncio高级流的性能,只不过这此时基于uvloop。gevent。在一个紧密循环里通过使用gevent.StreamServer和一个gevent套接字发送接受数据。asyncio。看起来普通的asyncio非常的快速!跟第2和4点类似,我们测试了一个最小的回声协议,它是使用纯Python的asyncio所实现的。nodejs。我们使用net.createServer API 在nodejs v4.2.6里测试流的性能。uvloop。这个基准测试测试了一个最小的回声协议(就如 #2, #4, #8),它是使用基于uvloop的asyncio实现的。 使用1 KiB消息的情况下,uvloop是最快的实现,可以高达每秒钟105,000的请求!使用100 KiB消息的情况下, uvloop的速度可以达到大概2.3 GiB/s。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编写高性能的网络代码更容易了。

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