【问题标题】:Ideal method for sending multiple HTTP requests over Python? [duplicate]通过 Python 发送多个 HTTP 请求的理想方法? [复制]
【发布时间】:2012-05-20 06:46:37
【问题描述】:

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

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

【问题讨论】:

标签: python http concurrency httprequest


【解决方案1】:

如果 a lot 真的 a lot 比您可能想要使用异步 io 而不是线程。

requests + gevent = grequests

GRequests 允许您将 Requests 与 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)

【讨论】:

  • 我想使用这种方法向大约 50,000 个 url 发送请求。这是一个好的策略吗?另外,超时等异常呢?
  • @John 是的,是的。至于异常见safe_mode参数和问题953
  • 我不能使用 grequest 发送超过 30 个请求。当我这样做时,我得到“url 超出最大重试次数:...,打开的文件太多”。有没有办法解决这个问题?
  • 警告词:grequests 似乎已被放弃,并且没有错误处理。我个人的建议是 github.com/ross/requests-futures ,它同样快,并且通过 backports 也适用于 2.7。
  • @droope 看起来 grequests 并没有被放弃,而且在 python_ver < 3.4 上运行似乎更容易。您是否有指向您正在谈论的 backports 包的链接?这是我看到的最受欢迎的包:pypi.python.org/pypi/backports.ssl_match_hostname
【解决方案2】:

听起来像是Twisted 的出色应用程序。这里有一些web-related examples,包括如何download a web page。这是database connections with Twisted上的一个相关问题。

请注意,Twisted 依赖线程同时执行多项操作。相反,它采用cooperative multitasking 方法——您的主脚本启动反应器,反应器调用您设置的函数。您的函数必须先将控制权交还给反应器,然后反应器才能继续工作。

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 同意 Polscha,在这里。大多数时候,当您向任意服务发出 HTTP 请求时,所花费的大部分(时钟)时间都在等待网络和远程服务响应。因此,在合理的范围内,线程越多越好,因为在任何给定时刻,这些线程中的大多数将只是在等待队列中。一定要注意 Polscha 关于服务限制的说明。
    • 谢谢大家 - 该服务是商业性的,我们正在为此付费。它非常快,不会成为瓶颈。在这种情况下,最好的选择是什么?
    • @user1094786 在这种情况下,只需尝试构建请求管道并在每个阶段试验多个线程。试试吧,迟早你会找到上限的:-)
    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 2014-09-02
    • 2013-01-15
    • 1970-01-01
    • 2022-07-26
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多