2013-07-30 4 views
3

나는 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 개의 요청입니까? 그건 그렇고 아파치 서버를 가리키는 요청을하려고했는데 그 결과도 마찬가지였다.

+1

가장 좋은 추측은 이것이 파이썬 코드가 아니라 서버와 관련이 있다는 것입니다. 두 가지 솔루션 모두'httlib.HTTPConnection'을 사용합니다 (요청은 이것을 사용합니다).하지만 그 클래스는 매직 넘버 100을 가지고 있지 않습니다. 나는 서버를 비난한다. – Lukasa

+0

어떤 버전의 요청을 사용하고 있습니까? 현재 버전의 docs :'urllib3 덕분에, 세션 내에서 keep-alive는 100 % 자동으로 실행됩니다! ' – brechin

답변

3

두 솔루션 모두 Lukasa와 같은 코드를 공유 했으므로 사실은 Apache 또는 Tomcat 을 쿼리 할 때마다 두 결과가 모두 동등하다는 사실이 나를 파이썬 코드와 관련 있다고 생각하게했습니다. 그러나 사실 그것은 서버 구성과 관련이 있습니다.

트릭은 Apache와 Tomcat이 동일한 TCP 연결 내에서 몇 개의 HTTP 요청을 만들 수 있는지 나타내는 설정을 공유한다는 것입니다.

MaxKeepAliveRequests: 

    The MaxKeepAliveRequests directive limits the number of requests allowed per connection when KeepAlive is on 
    Default: MaxKeepAliveRequests 100 

이 값을 단지 아주 수정하여 http://httpd.apache.org/docs/2.2/en/mod/core.html#maxkeepaliverequests

를 참조하십시오

maxKeepAliveRequests: 

    The maximum number of HTTP requests which can be pipelined until the connection is closed by the server. 
    If not specified, this attribute is set to 100. 

http://tomcat.apache.org/tomcat-7.0-doc/config/http.html#Standard_Implementation

아파치를 참조하십시오 : 그리고 둘 다 100

톰캣의 기본 값이 몇 개의 연결이 실제로 생성 될 수 있음 d