Python 2.7 python,通过一个网络连接发送多个HTTP请求

Python 2.7 python,通过一个网络连接发送多个HTTP请求,python-2.7,connection,python-requests,httplib,httplib2,Python 2.7,Connection,Python Requests,Httplib,Httplib2,我正在编写一个Python2.7脚本,它必须在FedoraCommons存储库中检查20000个对象中是否存在某些数据。 基本上,这意味着向存储库(在Tomcat服务器上运行)上的20000个不同URL发送20000个HTTP请求 我编写了一个脚本来完成这项工作,但服务器系统管理员警告我,它打开了太多的网络连接,这会导致一些问题 到目前为止,我的脚本使用urllib2发出HTTP请求 response = urllib2.urlopen(url) response_content

我正在编写一个Python2.7脚本,它必须在FedoraCommons存储库中检查20000个对象中是否存在某些数据。 基本上,这意味着向存储库(在Tomcat服务器上运行)上的20000个不同URL发送20000个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服务器的请求,结果是相同的。

这两个解决方案共享了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.

阿帕奇:

MaxKeepAliveRequests:

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


通过修改这些值,实际上只能创建很少的连接

我的最佳猜测是,这与服务器有关,而不是与Python代码有关。您的两个解决方案都使用了
httlib.HTTPConnection
(请求在引擎盖下使用此选项),但该类中的任何地方都没有魔法数字100。我责备服务器。你使用的是哪种版本的请求?从当前版本文档:
多亏了urllib3,保持活动状态在会话中是100%自动的