나는 20'000 개 개체의 일부 데이터 존재 여부를 Fedora Commons 저장소에서 확인해야하는 Python 2.7 스크립트를 작성하고 있습니다. 기본적으로 이것은 저장소 (Tomcat 서버에서 실행되는)의 20,000 개의 다른 URL에 20,000 개의 HTTP 요청을 보내는 것을 의미합니다.파이썬, 하나의 네트워크 연결을 통해 많은 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 개의 요청입니까? 그건 그렇고 아파치 서버를 가리키는 요청을하려고했는데 그 결과도 마찬가지였다.
가장 좋은 추측은 이것이 파이썬 코드가 아니라 서버와 관련이 있다는 것입니다. 두 가지 솔루션 모두'httlib.HTTPConnection'을 사용합니다 (요청은 이것을 사용합니다).하지만 그 클래스는 매직 넘버 100을 가지고 있지 않습니다. 나는 서버를 비난한다. – Lukasa
어떤 버전의 요청을 사용하고 있습니까? 현재 버전의 docs :'urllib3 덕분에, 세션 내에서 keep-alive는 100 % 자동으로 실행됩니다! ' – brechin