通过Python发送多个HTTP请求的理想方法?

时间:2012-05-11 16:34:16

标签: python http concurrency httprequest

  

可能重复:
  Multiple (asynchronous) connections with urllib2 or other http library?

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

3 个答案:

答案 0 :(得分:26)

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

requests + 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)

答案 1 :(得分:1)

您应该使用多线程以及管道请求。例如search-> details-> save

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

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

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

答案 2 :(得分:0)

听起来像Twisted的优秀应用程序。以下是一些web-related examples,包括如何download a web page。以下是database connections with Twisted的相关问题。

请注意,Twisted确实依赖线程同时执行多项操作。相反,它采用cooperative multitasking方法---您的主脚本启动反应堆,反应堆调用您设置的功能。在反应堆继续工作之前,您的功能必须将控制权返回到反应堆。