挑战:如何使用 Python 在一秒内发送 > 1000 个 HTTP 请求
Challenge: How to send > 1000 HTTP requests in one second with Python
考虑以下情况:有一个慢速服务器使用大约 200 毫秒 来处理请求(不包括网络传输时间)。而现在,我们需要每秒发送一堆请求。
读完这个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
谁能帮我弄清楚为什么加速比这么低?有没有其他机制可以让它更快?
我知道这是旧的 post 但有人可能仍然需要它。
如果您想进行负载测试但想使用 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
考虑以下情况:有一个慢速服务器使用大约 200 毫秒 来处理请求(不包括网络传输时间)。而现在,我们需要每秒发送一堆请求。
读完这个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
谁能帮我弄清楚为什么加速比这么低?有没有其他机制可以让它更快?
我知道这是旧的 post 但有人可能仍然需要它。
如果您想进行负载测试但想使用 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