Python'un urllib2 kitaplığını kullanarak belirli bir ana bilgisayara çeşitli http istekleri yapıyorum. Bir istek yapıldığında, yeni bir tcp ve http bağlantısı oluşturulur ve bu da dikkate değer bir zaman alır. Tlp/http bağlantısını urllib2 kullanarak canlı tutmanın bir yolu var mı?Birden çok istekte bulunurken Python'un urllib2'sini Hızlandırma
cevap
httplib'a geçiş yaparsanız, temel bağlantı üzerinde daha iyi bir kontrole sahip olacaksınız. Örneğin
:
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()
bu 2 HTTP aynı temel TCP bağlantısı üzerinde GETler gönderirdi.
Geçmişte iyi bir etki yaratmak için üçüncü taraf urllib3
kitaplığını kullandım. Yeniden kullanım için havuzları birleştirerek urllib2
'u tamamlayacak şekilde tasarlanmıştır. the wiki den
Modifiye örnek: düz httplib daha otomatik bir şey gerekiyorsa
>>> 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
Bu kütüphaneyi bulamıyorum, link öldü. http://stackoverflow.com/questions/18221809/sending-a-few-requests-using-one-connection adresine bakabilir misiniz? –
, işte bu evre korumalı değil de, yardımcı olabilir.
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
Bu, httplib python'un bir parçası olduğu için iyi bir yanıttır. Bu bizi üçüncü bir parti modülü kurmak zorunda kalmamamızdan kurtarıyor. Teşekkürler! –
Belki birileri için yararlı olacak, HTTPSConnection da var. – Petr