2010-01-05 4 views
19

Tôi đang thực hiện một số yêu cầu http cho một máy chủ cụ thể bằng cách sử dụng thư viện urllib2 của python. Mỗi khi một yêu cầu được thực hiện một kết nối tcp và http mới được tạo trong đó có một số lượng đáng chú ý của thời gian. Có cách nào để giữ kết nối tcp/http còn sống bằng cách sử dụng urllib2 không?Làm thế nào để tăng tốc độ urllib2 của Python khi thực hiện nhiều yêu cầu

Trả lời

25

Nếu bạn chuyển sang httplib, bạn sẽ có quyền kiểm soát tốt hơn kết nối cơ bản.

Ví dụ:

import httplib 

conn = httplib.HTTPConnection(url) 

conn.request('GET', '/foo') 
r1 = conn.getresponse() 
r1.read() 

conn.request('GET', '/bar') 
r2 = conn.getresponse() 
r2.read() 

conn.close() 

này sẽ gửi 2 HTTP GET trên kết nối TCP cơ bản giống nhau.

+0

Đó là câu trả lời hay vì httplib là một phần của python. Điều đó giúp chúng tôi không phải cài đặt mô-đun bên thứ ba. Cám ơn! –

+0

Có thể nó sẽ dành cho ai đó hữu ích, cũng có HTTPSConnection. – Petr

2

Tôi đã sử dụng thư viện urllib3 của bên thứ ba để có hiệu lực tốt trong quá khứ. Nó được thiết kế để bổ sung urllib2 bằng cách gộp các kết nối để sử dụng lại.

dụ Modified từ the wiki:

>>> from urllib3 import HTTPConnectionPool 
>>> # Create a connection pool for a specific host 
... http_pool = HTTPConnectionPool('www.google.com') 
>>> # simple GET request, for example 
... r = http_pool.urlopen('GET', '/') 
>>> print r.status, len(r.data) 
200 28050 
>>> r = http_pool.urlopen('GET', '/search?q=hello+world') 
>>> print r.status, len(r.data) 
200 79124 
+0

Tôi không thể tìm thấy thư viện này, liên kết đã chết. bạn có muốn xem http://stackoverflow.com/questions/18221809/sending-a-few-requests-using-one-connection không? –

0

Nếu bạn cần một cái gì đó nhiều hơn tự động httplib đồng bằng, điều này có thể giúp đỡ, mặc dù nó không phải threadsafe.

try: 
    from http.client import HTTPConnection, HTTPSConnection 
except ImportError: 
    from httplib import HTTPConnection, HTTPSConnection 
import select 
connections = {} 


def request(method, url, body=None, headers={}, **kwargs): 
    scheme, _, host, path = url.split('/', 3) 
    h = connections.get((scheme, host)) 
    if h and select.select([h.sock], [], [], 0)[0]: 
     h.close() 
     h = None 
    if not h: 
     Connection = HTTPConnection if scheme == 'http:' else HTTPSConnection 
     h = connections[(scheme, host)] = Connection(host, **kwargs) 
    h.request(method, '/' + path, body, headers) 
    return h.getresponse() 


def urlopen(url, data=None, *args, **kwargs): 
    resp = request('POST' if data else 'GET', url, data, *args, **kwargs) 
    assert resp.status < 400, (resp.status, resp.reason, resp.read()) 
    return resp