Я работаю над скриптом python 2.7, который должен проверить репозиторий Fedora Commons на наличие некоторых данных в 20'000 объектах. В основном это означает отправку 20'000 HTTP-запросов на 20 000 разных URL-адресов в репозитории (который работает на сервере Tomcat).python, отправить много HTTP-запросов через одно сетевое подключение
Я написал сценарий, который выполняет задание, но администратор системы предупредил, что он открывает слишком много сетевых подключений, что вызывает некоторые проблемы.
Мой скрипт использует до сих пор urllib2 для создания HTTP-запросов.
response = urllib2.urlopen(url)
response_content = response.read()
И на самом деле этот код открывает одно новое сетевое соединение для каждого запроса.
Я попытался использовать другие библиотеки для выполнения запросов, но не смог найти способ повторного использования одного и того же соединения для всех запросов. Оба решения ниже по-прежнему открывают много сетевых подключений, даже если их количество действительно ниже (на самом деле оба решения, похоже, открывают одно соединение для 100 HTTP-запросов, что в моем случае по-прежнему составляет около 200 подключений).
HTTPLIB:
url = "http://localhost:8080/fedora/objects/test:1234?test="
url_infos = urlparse(url)
conn = httplib.HTTPConnection(url_infos.hostname + ":" + str(url_infos.port))
for x in range(0, 20000):
myurl = url + str(x)
conn.request("GET", myurl)
r = conn.getresponse()
response_content = r.read()
print x, "\t", myurl, "\t", r.status
запросы:
url = "http://localhost:8080/fedora/objects/test:1234?test="
s = requests.Session()
for x in range(0, 20000):
myurl = url + str(x)
r = s.get(myurl)
response_content = r.content
print x, "\t", myurl, "\t", r.status_code
Даже если число подключений намного лучше, в идеале я хотел бы использовать один или очень мало соединений для всех запросов. Возможно ли это? Является ли это число 100 запросов на соединение, связанных с системой или сервером? Кстати, я также пытался сделать запросы, указывающие на сервер Apache, и результат был таким же.
Мое лучшее предположение, что это связано с сервером, а не с кодом Python. Оба решения используют 'httlib.HTTPConnection' (запросы используют это под капотом), но этот класс не имеет магического номера 100 в нем. Я обвиняю серверы. – Lukasa
Какую версию запросов вы используете? Из текущей версии docs: 'благодаря urllib3, keep-alive на 100% автоматический в течение сеанса! ' – brechin