【问题标题】:How to send 1k POST http requests per second with data using Python?如何使用 Python 每秒发送 1k POST http 请求和数据?
【发布时间】:2017-05-19 09:24:53
【问题描述】:

我需要对我的 API 进行压力测试。 我修改了that example 以发送 POST 而不是 HEAD,我还向我的请求添加了一些数据:

count = int(sys.argv[1])
url = "http://api.example.com/"
test_id = datetime.now().strftime("%H%M%S%f")
data = []
for i in range(count):
    req_data = {
        'test_id': test_id,
        'param1': i,
        'param2': 'aaa',
        'param3': 'bbb',
    }
    data.append(req_data)

start_time = time.time()
res = grequests.map(grequests.post(url, data=data[i]) for i in range(count))
sending_time = time.time() - start_time
print(sending_time)

之后性能下降到每秒 5 个请求! 我也尝试了来自that question 的所有答案并收到了相同的结果。达到 1000 req/sec 是真的吗?

【问题讨论】:

  • 当然,与 HEAD 相比,POST 在您的 Web 服务器中需要更多的处理。 Web 服务器处理并发请求的能力如何?你可以配置它来使用更多的工人吗?它是使用工人吗?通过切换到 POST,您的问题范围现在必须包括服务器和客户端中的处理。
  • 我在服务器端使用 Twisted
  • 将注意力转移到让服务器每秒处理 1000 个请求。客户端代码不是您的瓶颈。仅仅使用 Twisted 并不是一根魔杖。您需要将处理程序分解为多个延迟处理程序,以便更好地重叠处理和来自并发请求的 I/O。
  • 听起来您可能发现了服务器的瓶颈。通过服务器代码回溯并查看减速发生的位置并进行调整。寻找 deferToThread 之类的东西或任何需要一段时间才能完成的延迟。

标签: python http twisted python-asyncio grequests


【解决方案1】:

是的,你可以这样做。

您可以通过创建多个进程和线程来实现这一点。

例如。使用子进程

在这里,我们创建了 10 个子进程,每个子进程将发出 100 个请求。因此,在一秒钟内,您将能够执行 1000 个请求。

import subprocess

for i in range(10):
    subprocess.Popen(["python","pathToPythonScript/stressTesting.py","100"])

【讨论】:

  • 谁能解释一下这个答案有什么问题?在这里写下评论,这样我可以增加我的知识。
  • 并不是因为 10 个子进程每个发出 100 个请求,它们就会在一秒钟内完成。此外,最初的问题是关于 grequests 和可能的 asyncio,它们将比这快得多。
  • 我对 asyncio 了解不多,但是有了这个你可以达到接近 100。如果你没有内存或处理能力问题,你可以将计数器从 10 增加到 15,然后你将收到 1000 个请求。我知道这是解决该问题的方法,而不是正确的解决方案。但是,是的,感谢您向我介绍 asyncio。
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2021-01-17
相关资源
最近更新 更多