0

是否有使用 asyncore.dispatcher 执行 HTTP 客户端的“标准”或众所周知的类?

我可以做一个,但我不想再次发明轮子:)

4

1 回答 1

2

简短的回答是:不,至少不是您想要使用的任何东西。

大多数人认为这asyncore对于如何编写select基于事件循环的“示例代码”有点有用,但对于超出琐碎复杂性的实际项目的框架来说没有用。

过去有一些项目可以在其上构建严肃的东西asyncore,包括至少一个 Web服务器,但我不知道 Web客户端。这并不意味着不存在这样的东西……但我不希望它得到良好的维护或大量使用。

asyncore人们大多专注于从头开始构建新框架,而不是在. 最流行的可能是twisted(其架构asyncoregevent.一个事件循环)。

与此同时,Guido 和朋友们正在设计一个新的现代异步库(参见PEP 3146tulip详细信息),它可能会出现在 3.4 中,并且可能会弃用asyncore.

所以,你的选择是:

  • httplib用和自己构建它asyncore
  • 搜索一个旧的、部分完成的实现并完成它。
  • 使用twisted, gevent,tulip
  • 使用不同的高级抽象,例如pycurl(或任何其他包装libcurl及其curl_multiAPI 的库)或grequests(使用 来同步非常高级的requestsHTTP 客户端库gevent)。

当然,您是否真的需要单线程事件循环也值得考虑。大多数客户端应用程序不需要处理十几个左右的连接,每个套接字的线程可以在任何平台上轻松处理。(当然,如果你有任何受 CPU 限制的代码,Python 线程会很糟糕,但基于单线程事件循环的代码会更糟糕,所以我认为这不是问题。)


首先,对您的评论进行一些一般性评论:

我不确定您所说的“性能”是什么意思。通常,对于网络应用程序,您会担心可扩展性:您可以同时处理多少个连接、每秒可以建立多少新连接、可以维持多少吞吐量等。性能——通常以多少 CPU/功率来衡量- 你在稳态工作流程中使用的绘制/散热——通常只有在你获得所需的所有可扩展性时才会使用它,即使这样,也只有当你计划运行几十个堆满盒子的房间时运行你的服务器。

无论如何,我不知道你在测试什么,但所有这些选项在 Linux 和 Mac OS X/*BSD 上都明显超过了速度asyncore,并且在任何人做过的任何合理测试下,在 Windows 上都完全被打败了。他们将使用 IOCP、epollkqueue而不是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,但服务器负载很高。

如果服务器负载太高,那只能意味着您的客户端运行得太快……这是一个很好的问题;你总是可以限制一个太快的客户端,但是你通常不能对一个太慢的客户端做很多事情,除非重写整个事情。

于 2013-04-10T08:03:30.090 回答