是否有使用 asyncore.dispatcher 执行 HTTP 客户端的“标准”或众所周知的类?
我可以做一个,但我不想再次发明轮子:)
简短的回答是:不,至少不是您想要使用的任何东西。
大多数人认为这asyncore
对于如何编写select
基于事件循环的“示例代码”有点有用,但对于超出琐碎复杂性的实际项目的框架来说没有用。
过去有一些项目可以在其上构建严肃的东西asyncore
,包括至少一个 Web服务器,但我不知道 Web客户端。这并不意味着不存在这样的东西……但我不希望它得到良好的维护或大量使用。
asyncore
人们大多专注于从头开始构建新框架,而不是在. 最流行的可能是twisted
(其架构asyncore
与gevent
.一个事件循环)。
与此同时,Guido 和朋友们正在设计一个新的现代异步库(参见PEP 3146和tulip
详细信息),它可能会出现在 3.4 中,并且可能会弃用asyncore
.
所以,你的选择是:
httplib
用和自己构建它asyncore
。twisted
, gevent
,tulip
等pycurl
(或任何其他包装libcurl
及其curl_multi
API 的库)或grequests
(使用 来同步非常高级的requests
HTTP 客户端库gevent
)。当然,您是否真的需要单线程事件循环也值得考虑。大多数客户端应用程序不需要处理十几个左右的连接,每个套接字的线程可以在任何平台上轻松处理。(当然,如果你有任何受 CPU 限制的代码,Python 线程会很糟糕,但基于单线程事件循环的代码会更糟糕,所以我认为这不是问题。)
首先,对您的评论进行一些一般性评论:
我不确定您所说的“性能”是什么意思。通常,对于网络应用程序,您会担心可扩展性:您可以同时处理多少个连接、每秒可以建立多少新连接、可以维持多少吞吐量等。性能——通常以多少 CPU/功率来衡量- 你在稳态工作流程中使用的绘制/散热——通常只有在你获得所需的所有可扩展性时才会使用它,即使这样,也只有当你计划运行几十个堆满盒子的房间时运行你的服务器。
无论如何,我不知道你在测试什么,但所有这些选项在 Linux 和 Mac OS X/*BSD 上都明显超过了速度asyncore
,并且在任何人做过的任何合理测试下,在 Windows 上都完全被打败了。他们将使用 IOCP、epoll
或kqueue
而不是poll
. 其中一些还将中心代码放在 C 中。它们都在大量实际使用中进行了广泛的测试和调整,而自十多年前添加支持asyncore
以来没有任何改进。poll
(这并不是因为asyncore
它已经足够好,而是因为它还不够好,不值得改进。)
但对于客户端应用程序,可扩展性和性能通常都不是问题。仅从几十个站点进行并行下载通常足以使您的 FTTH/cable/DSL/等饱和。带宽,除此之外,您还想要什么?
所以,我提出这些替代方案的原因不是为了性能或可扩展性,而是为了简单和完整。Twisted 的 HTTP 客户端或grequests
意味着您只需要编写 5 行代码,并且您有一些可以工作的东西,并且所有困难的部分都已经经过深思熟虑并经过大量测试。即使是自己构建它,运行httplib
/ urllib2
/whatever所需的工作量也要少得多(并且为 bug 提供的机会要少得多),而gevents
不是把它拆开并重新构建它asyncore
而不是阻塞套接字。
扭曲-我是初学者,至少目前没有那么多时间进行投资。
虽然twisted
显然是一个巨大的项目,但您不必全部学习,对于初学者来说应该比asyncore
. 查看我之前提供的链接中的 HTTP 客户端示例。httplib
将其与使用和做同样的事情需要多少代码进行比较asyncore
。
gevent - 性能类似于 asyncore,但服务器负载很高。
如果服务器负载太高,那只能意味着您的客户端运行得太快……这是一个很好的问题;你总是可以限制一个太快的客户端,但是你通常不能对一个太慢的客户端做很多事情,除非重写整个事情。