<body> <header style="background-image: url(formula.jpg)" class="mb-head"><div class="row"><div class="large-12 columns"><h1 class="m-logo"><a href="/"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">魔术堆栈</font></font></a></h1><div class="title-cnt"><h1><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">uvloop:快速的Python网络连接</font></font></h1><h2><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">作者Yury </font></font><a href="http://twitter.com/1st1"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Selivanov @ 1st1</font></font></a><br><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 2016年5月3日</font></font></h2></div></div></div></header> <article class="mb-article"><section><div class="row"><div class="large-9 columns"><h2><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">TL; DR</font></font></h2></div></div><div class="row"><div class="large-9 columns"><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">asyncio是Python标准库附带的异步I / O框架。</font><font style="vertical-align: inherit;">在此博客文章中,我们介绍</font></font><a href="https://github.com/MagicStack/uvloop"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">uvloop</font></font></a><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">:asyncio事件循环的完整替代品。</font><font style="vertical-align: inherit;">uvloop用Cython编写,并建立在</font></font><a href="http://libuv.org"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">libuv之上</font></font></a><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">。</font></font></p><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">uvloop使asyncio更快。</font><font style="vertical-align: inherit;">实际上,它至少</font><font style="vertical-align: inherit;">比nodejs,gevent和任何其他Python异步框架</font></font><b><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">快2倍</font></font></b><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">。</font><font style="vertical-align: inherit;">基于uvloop的asyncio的性能接近Go程序。</font></font></p></div><div class="large-3 columns mb-sidebar"><p><span></span></p></div></div><div class="row"><div class="large-9 columns"><h2><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">异步和uvloop</font></font></h2></div></div><div class="row"><div class="large-9 columns"><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">PEP 3156引入的asyncio模块是网络传输,协议和流抽象的集合,带有可插入事件循环。</font><font style="vertical-align: inherit;">事件循环是异步的核心。</font><font style="vertical-align: inherit;">它提供以下API:</font></font></p><ul><li><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">安排电话</font></font></li><li><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">通过网络传输数据,</font></font></li><li><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">执行DNS查询,</font></font></li><li><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">处理操作系统信号,</font></font></li><li><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">方便的抽象来创建服务器和连接,</font></font></li><li><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">异步处理子流程。</font></font></li></ul></div><div class="large-3 columns mb-sidebar"><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 目前,uvloop仅在* nix平台和Python 3.5上可用。 </font></font></p></div></div><div class="row"><div class="large-9 columns"><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">uvloop是内置asyncio事件循环的替代产品。</font><font style="vertical-align: inherit;">您可以使用pip安装uvloop:</font></font></p><pre class="code"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">$ pip安装uvloop</font></font></pre><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">在异步代码中使用uvloop很简单:</font></font></p><pre class="code"><b><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">导入</font></font></b><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">异步 </font></font><b><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">导入</font></font></b><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> uvloop</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())</font></font></pre><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">上面的代码片段使任何</font></font><code>asyncio.get_event_loop()</code><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">调用都返回uvloop的实例。</font></font></p></div><div class="large-3 columns mb-sidebar"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;"> 您还可以通过调用显式创建uvloop实例 </font></font><code>uvloop.new_event_loop()</code></div></div><div class="row"><div class="large-9 columns"><h2><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">建筑</font></font></h2></div></div><div class="row"><div class="large-9 columns"><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">uvloop用Cython编写,并建立在libuv之上。</font></font></p><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">libuv是供nodejs使用的高性能,多平台异步I / O库。</font><font style="vertical-align: inherit;">由于nodejs的普及和流行,libuv既快速又稳定。</font></font></p><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">uvloop实现所有异步事件循环API。</font><font style="vertical-align: inherit;">高级Python对象包装了低级libuv结构和函数。</font><font style="vertical-align: inherit;">继承用于保持代码DRY并确保任何手动内存管理与libuv原语的寿命保持同步。</font></font></p></div></div><div class="row"><div class="large-9 columns"><h2><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">基准测试</font></font></h2></div></div><div class="row"><div class="large-9 columns"><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">为了检查uvloop的性能如何与其他实现相提并论,我们创建了一个</font></font><a href="https://github.com/MagicStack/vmbench"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">工具台</font></font></a><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">来对TCP和UNIX套接字I / O以及HTTP协议的性能进行基准测试。</font></font></p></div><div class="large-3 columns mb-sidebar"><p><span></span></p></div></div><div class="row"><div class="large-9 columns"><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">标有基准的服务器在带有外部负载生成工具(</font><font style="vertical-align: inherit;">HTTP基准的</font></font><a href="https://github.com/wg/wrk"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">wrk</font></font></a><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">)</font><font style="vertical-align: inherit;">的Docker容器中运行,该工具</font><font style="vertical-align: inherit;">可以测量请求的吞吐量和延迟。</font></font></p><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">本博客文章中的所有基准测试均在3.70GHz的Intel Xeon CPU E5-1620 v2和Ubuntu Linux上运行。</font><font style="vertical-align: inherit;">我们使用Python 3.5,所有服务器均为单线程。</font><font style="vertical-align: inherit;">另外,我们使用</font></font><code>GOMAXPROCS=1</code><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Go代码,nodejs不使用集群,并且所有Python服务器都是单进程的。</font><font style="vertical-align: inherit;">每个基准设置</font></font><code>TCP_NODELAY</code><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">标志。</font></font></p><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">Mac OS X上的基准测试结果非常相似。</font></font></p></div></div><div class="row"><div class="large-9 columns"><h3><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">TCP协议</font></font></h3></div></div><div class="row"><div class="large-9 columns"><p><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">此基准测试了具有不同消息大小的简单回显服务器的性能。</font><font style="vertical-align: inherit;">我们使用1、10和100 KiB软件包。</font><font style="vertical-align: inherit;">并发级别为10。每个基准测试运行30秒。</font></font></p></div><div class="large-3 columns mb-sidebar"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">另请参阅完整的TCP基准</font></font><a href="tcp-bench.html"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">报告</font></font></a><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">。</font></font></div></div><div class="row"><div class="large-12 columns"><div class="mb-charts"><svg ></div></div> <div class="goog-te-spinner-pos"><div class="goog-te-spinner-animation"><svg xmlns="http://www.w3.org/2000/svg" class="goog-te-spinner" width="96px" height="96px" viewBox="0 0 66 66"><circle class="goog-te-spinner-path" fill="none" stroke-width="6" stroke-linecap="round" cx="33" cy="33" r="30"></circle></svg></div></div></body>

相关文章: