Задача: Как отправить> 1000 HTTP-запросов за одну секунду с помощью Python
Рассмотрим следующий случай: существует медленный сервер, который использует около 200 мс для обработки запроса (без учета времени передачи по сети). И теперь нам нужно отправлять кучу запросов каждую секунду.
После прочтения этого поста, я попробовал многопоточность, многопроцессность, витую (agent.request) и eventlet. Но самое большое ускорение составляет всего 6x, что достигается с помощью скрученного и 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
Кто-нибудь может помочь мне объяснить, почему ускорение настолько низкое? И есть ли другой механизм, который мог бы сделать это намного быстрее?
1 ответ
Я знаю, что это старый пост, но кому-то это может понадобиться.
Если вы хотите выполнить нагрузочное тестирование, но хотите использовать python, вам следует использовать такой инструмент, как locust: http://locust.io/
Вот мое решение, которое привело к 10 000 запросов за 10 секунд:
Необходимый пакет
Код:
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