10

可能重复:
与 urllib2 或其他 http 库的多个(异步)连接?

我正在开发一个运行 Python 代码的 Linux Web 服务器,以通过 HTTP 从 3rd 方 API 获取实时数据。数据被放入 MySQL 数据库。我需要对很多 URL 进行大量查询,而且我需要快速完成(更快 = 更好)。目前我使用 urllib3 作为我的 HTTP 库。解决此问题的最佳方法是什么?我应该产生多个线程(如果是,有多少?)并且每个查询都针对不同的 URL?我很想听听您对此的看法-谢谢!

4

3 回答 3

29

如果真的很多,那么您可能想要使用异步 io 而不是线程。

请求+ gevent = grequests

GRequests 允许您使用带有 Gevent 的请求来轻松地发出异步 HTTP 请求。

import grequests

urls = [
    'http://www.heroku.com',
    'http://tablib.org',
    'http://httpbin.org',
    'http://python-requests.org',
    'http://kennethreitz.com'
]

rs = (grequests.get(u) for u in urls)
grequests.map(rs)
于 2012-05-12T00:03:24.067 回答
1

您应该使用多线程以及流水线请求。例如搜索->详细信息->保存

您可以使用的线程数不仅仅取决于您的设备。该服务可以处理多少个请求?它允许运行多少个并发请求?甚至您的带宽也可能成为瓶颈。

如果您正在谈论一种抓取 - 该服务可能会在一定的请求限制后阻止您,因此您需要使用代理或多个 IP 绑定。

至于我,在大多数情况下,我可以在笔记本电脑上通过 python 脚本运行 50-300 个并发请求。

于 2012-05-11T16:42:28.807 回答
0

听起来像是Twisted的优秀应用程序。以下是一些与网络相关的示例,包括如何下载网页这是与 Twisted 的数据库连接的相关问题。

请注意,Twisted 不依赖线程同时执行多项操作。相反,它采用协作式多任务方法——您的主脚本启动反应器,反应器调用您设置的函数。您的函数必须在反应器继续工作之前将控制权返回给反应器。

于 2012-05-11T17:40:59.860 回答