2013-07-30 120 views
3

我正在研究python 2.7脚本,它必须在20'000对象中检查Fedora Commons存储库中是否存在某些数据。 基本上这意味着向存储库(运行在Tomcat服务器上)的20'000个不同URL发送20'000个HTTP请求。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服务器,结果是一样的。

+1

我最好的猜测是这与服务器有关,而不是Python代码。你的两个解决方案都使用'httlib.HTTPConnection'(请求使用这个),但是这个类在它的任何地方都没有神奇数字100。我责怪服务器。 – Lukasa

+0

您使用的是哪个版本的请求?从当前版本的文档:'感谢urllib3,在一个会话中保持活动是100%自动的! ' – brechin

回答

3

两个解决方案都共享Lukasa所说的一些代码这一事实,以及事实上,无论何时查询Apache或Tomcat 都让我首先认为它与Python代码有关。但实际上它与服务器配置有关。

诀窍是Apache和Tomcat共享一个设置,该设置指示可以在同一个TCP连接内创建多少个HTTP请求。而且两者有100

的Tomcat默认值:

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

阿帕奇:

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

通过只有极修改这些值很少有连接可以创建indee d