【问题标题】:What is the fastest way to send 10,000 HTTP requests in Python 2.7?在 Python 2.7 中发送 10,000 个 HTTP 请求的最快方法是什么?
【发布时间】:2017-04-19 08:17:14
【问题描述】:

这会每秒向服务器发送大约 5 个请求。我需要每秒发送大约 40 个请求。服务器不限制我的请求(我已经运行了这个 Python 脚本的 10 个实例并且它已经工作)并且我的互联网不限制请求。

这是我的代码限制了我每秒的请求数。

是否可以让我的 Python 脚本发送更多请求?

【问题讨论】:

  • 如果您的代码没有错误,您应该将代码发布到 Code Review 而不是 Stack Overflow。那里的人非常乐意帮助您找出更有效的方法来编写代码。
  • @erik 这实际上是在寻求一种不同的技术,而不是为了代码清理。您可能在这里需要异步或线程请求之类的东西;这不是 CR 的真正用途。
  • 您研究过多线程吗?查看python2.7中的threading

标签: python python-2.7


【解决方案1】:

你可以/应该使用twisted。 treq 基于twisted 使其非常容易。因为它的完全异步请求/秒数将非常高,例如1000 甚至更多。

from treq import get
from twisted.internet import reactor


# This method is called whenever a response is recieved
def done(response):
   if response.code == 200:
       # do something with response
   reactor.stop()

for i in range(100000):
    get("http://www.somesite.com").addCallback(done)

reactor.run()

使用 twisted 进行异步编程的学习曲线很高,但最终你会得到非常好的结果。更多参考请看http://treq.readthedocs.io/en/latest/api.html

【讨论】:

  • 是否也可以根据我的需要限制请求/秒?我将如何使用我当前的代码来实现它?
  • 你可以在这里看到它为什么有用blog.mailgun.com/…
  • @JamesRicky 你如何限制使用requests 模块?
  • 就目前而言,我的代码对每秒请求数没有限制,但应该可以以某种方式限制每秒请求数(更少线程等...)。
  • 您将如何限制您遵循与 twisted 相同的逻辑的请求。我也不认为使用twistedrequests 来修复特定数字很容易,而是您可以使用解决方法来设置最大上限。
【解决方案2】:

我同意@anekix,使用twisted 是最好的方法。

你需要知道一件事,无论你使用哪种方法来处理 10000 个 HTTP 请求,都有打开文件描述符的限制,在 Linux 中基本上设置为 1000。 这意味着您只能拥有 1000 个并发 TCP 连接。但是,您可以通过 Linux 中的配置 /etc/security/limits.conf 来增加它

【讨论】:

    【解决方案3】:

    为什么不用Scapy 包用sendp (Layer 2) 生成流量,它的性能非常好。生成不同的数据包也很容易

    sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="eth1")
    

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多