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
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.
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
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? –
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
Đó 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! –
Có thể nó sẽ dành cho ai đó hữu ích, cũng có HTTPSConnection. – Petr