2014-01-10 32 views
4

我使用httplib从一个网站抓取一堆资源,我希望它以最低的成本,所以我设置'连接:保持活动'HTTP头对我的请求,但我不知道它实际上使用相同的TCP连接尽可能多的请求作为网络服务器允许的。确实httplib重用TCP连接?

i = 0 
    while 1: 
     i += 1 
     print i 
     con = httplib.HTTPConnection("myweb.com") 
     con.request("GET", "/x.css", headers={"Connection":" keep-alive"}) 
     result = con.getresponse() 
     print result.reason, result.getheaders() 

我的实施是否正确? 保持活力吗? 我应该把'con = httplib.HTTPConnection(“myweb.com”)'放在循环之外吗?

P.S:Web服务器的保持活动响应是好的, 我知道urllib3

+2

@CrazyCasta:你为什么认为它是重复的? 'urllib2'使用'Connection:close',即一个请求 - 一个连接。 'httplib'使用'HTTP/1.1',即默认情况下可以重新使用连接。相关:[持久性urllib.request连接到HTTP服务器](http://stackoverflow.com/q/9772854/4279) – jfs

+0

如果你看看这个问题,它是关于如何在python中执行多个HTTP请求。 urllib2有点误导。如果你看第一个答案,它特别涉及到httplib。 – CrazyCasta

回答

8

您的示例每次都通过循环创建一个新的TCP连接,因此不会重用该连接。

这个怎么样?

con = httplib.HTTPConnection("myweb.com") 
while True: 
    con.request("GET", "/x.css", headers={"Connection":" keep-alive"}) 
    result = con.getresponse() 
    result.read() 
    print result.reason, result.getheaders() 

此外,如果您只需要标头,则可以使用HTTP HEAD方法,而不是调用GET并丢弃内容。

0

如果通过循环&hellip每次报废HTTPConnection对象那肯定不能重用的连接;

+0

我把httpconnection创建在循环内部,以避免每次我调用request/getresponse时读取数据。当我把它放在循环之外时,我监视程序(通过wireshark),我不确定程序是如何工作的? – sia