【问题标题】:Challenge: How to send > 1000 HTTP requests in one second with Python挑战:如何使用 Python 在 1 秒内发送超过 1000 个 HTTP 请求
【发布时间】:2015-08-16 05:53:51
【问题描述】:

考虑以下情况:有一个慢速服务器使用大约 200ms 来处理请求(不包括网络传输时间)。现在,我们需要每秒发送一堆请求。

看了这篇post之后,我尝试过多线程、多进程、twisted(agent.request)和eventlet。但是最大的加速只有6x,这是通过twisted和eventlet实现的,都是用epoll实现的。

以下代码显示了带有 eventlet 的测试版本,

import eventlet
eventlet.monkey_patch(all=False, socket=True)

import requests

def send():
    pile = eventlet.GreenPile(30)
    for i in range(1000):
        pile.spawn(requests.get, 'https://api.???.com/', timeout=1)
    for response in pile:
        if response:
            print response.elapsed, response.text

任何人都可以帮助我弄清楚为什么加速如此低?还有其他机制可以让它更快吗?

【问题讨论】:

  • 目前需要多长时间?
  • 看看这对你有没有帮助:stackoverflow.com/questions/2632520/…
  • 1000 个请求,每个请求 200 毫秒 = 3.3 分钟。我不明白你为什么要超载你的服务器。为什么是 1000 ?为什么不是 1M?
  • @JérômeRadix,其实我的应用程序既是服务器又是客户端,它会向后端服务器发送一些类型的请求。目前1000还可以,以后1M也可以。
  • @Jacky 如果是挑战兄弟,你应该发布一份工作。 SO是为了消除疑虑

标签: python python-requests


【解决方案1】:

我知道这是一个旧帖子,但有人可能仍然需要它。

如果你想做负载测试但又想使用python,那么你应该使用像locust这样的工具:http://locust.io/

这是我的解决方案,它在 10 秒内产生了 10,000 个请求:

需要的包: sudo pip install grequests

代码:

import grequests
import time

start_time = time.time()
# Create a 10000 requests
urls = ['http://www.google.co.il']*10000
rs = (grequests.head(u) for u in urls)

# Send them.
grequests.map(rs)

print time.time() - start_time # Result was: 9.66666889191

【讨论】:

  • 我在笔记本电脑上运行代码并在 69.997563 秒后得到结果,在 23.694893 后运行 1k(CPU:i7 10gen 3GHz,RAM:16Gb,256Gb SSD,GPU Nvidia MX230 2Gb)
猜你喜欢
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 2021-01-17
相关资源
最近更新 更多