<h2>如何将请求库(或不同的urllib)与linuxepoll结合使用?在</h2>
<p>不幸的是,除非在构建这样一个库时考虑到了这种集成,否则您不能这样做。<strong>epoll</strong>,以及<strong>选择</strong>/<strong>poll</strong>/<strong>kqueue</strong>等都是<em>I/O多路复用</em>系统调用,需要围绕其构建整体程序架构。在</p>
<p>简单地说,一个典型的程序结构可以归结为</p>
<ul>
<li>你需要有一堆文件描述符(在你的例子中是非阻塞模式的套接字)</li>
<li>在一个或多个描述符上发生指定事件之前,系统调用(<strong>manepoll_wait</strong>,如果<strong>epoll</strong>)会阻塞</li>
<li>返回I/O可用描述符的信息</li>
</ul>
<p>在此之后,外部代码的工作就是处理这些描述符,即计算出有多少数据可用,调用一些回调等</p>
<p>如果库使用常规<em>阻塞</em>套接字,则并行化它的唯一方法是使用<em>线程</em>/<em>进程</em>
这里有一个关于这个主题的很好的<a href="https://eklitzke.org/blocking-io-nonblocking-io-and-epoll" rel="nofollow noreferrer">article</a>,示例使用C,这很好,因为它更容易理解引擎盖下实际发生的事情</p>
<h2>异步框架和请求库</h2>
<p>让我们看看有什么建议<a href="http://docs.python-requests.org/en/master/user/advanced/#blocking-or-non-blocking" rel="nofollow noreferrer">here</a></p>
<blockquote>
<p>If you are concerned about the use of blocking IO, there are lots of
projects out there that combine Requests with one of Python's
asynchronicity frameworks. Some excellent examples are
requests-threads, grequests, and requests-futures).</p>
</blockquote>
<p><strong>请求线程</strong>使用线程</p>
<p><strong>grequests</strong>-与gevent集成(这是另一个故事,见下文)</p>
<p><strong>请求未来</strong>事实上也是线程/进程</p>
<p>它们都与真正的异步性无关</p>
<h2>我应该用吗选择.epoll()或python拥有的众多异步框架之一</h2>
<p>请注意,<strong>epoll</strong>是<em>linux特有的</em>beast,它无法工作,即在具有不同机制的OS X上,称为<strong>kqueue</strong>。当你在写一个通用的工作队列时,这似乎不是一个好的解决方案。在</p>
<p>现在回到python。您可以选择以下选项:</p>
<p><strong>线程/进程/同期期货</strong>-不太可能,因为你的应用程序是典型的<a href="http://www.kegel.com/c10k.html" rel="nofollow noreferrer">C10K</a>服务器</p>
<p><strong>epoll/kqueue</strong>-你必须自己做所有事情。在获取httpurl的情况下,您不仅需要处理HTTP/ssl,还需要处理异步DNS解析。还可以考虑使用提供一些基本基础设施的<a href="https://docs.python.org/3/library/asyncore.html" rel="nofollow noreferrer">asyncore</a>[]</p>
<p><strong>twisted/tornado</strong>基于回调的框架,已经为您完成了所有底层工作</p>
<p><strong>gevent</strong>-如果您要重用现有的块库(urllib、requests等)并同时使用python2.x和python3.x,那么您可能会喜欢这样的解决方案。对于一个像你这样大小的应用程序,它可能没问题,但我不会把它用于任何更大的,应该是坚如磐石和运行在prod</p>
<p>异步<strong></p>
<blockquote>
<p>This module provides infrastructure for writing single-threaded
concurrent code using coroutines, multiplexing I/O access over sockets
and other resources, running network clients and servers, and other
related primitives</p>
</blockquote>
<p>它有你可能需要的一切。
还有很多库使用流行的RDBMs和http
<a href="https://github.com/aio-libs" rel="nofollow noreferrer">https://github.com/aio-libs</a></p>
<p>但是它缺乏对python2.x的支持,有<a href="https://pypi.python.org/pypi/trollius" rel="nofollow noreferrer">ports</a>到python2.x的asyncio,但不确定它们有多稳定</p>
<h3>最后</h3>
<p>因此,如果我可以牺牲python2.x,我个人会选择asyncio和相关的库</p>
<p>如果您真的需要Python2.x,请根据所需的稳定性和假定的峰值负载使用上述方法之一</p>