Задача: Как отправить> 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
Другие вопросы по тегам