2016-01-25 5 views
0

Я использую urllib.request.urlopen для получения данных с сервера по HTTPS. Функция называется много на том же сервере, часто до одного и того же URL-адреса. Однако, в отличие от стандартных веб-браузеров, которые выполняют рукопожатие при первоначальном запросе, вызов отдельного urlopen(url) приведет к новому рукопожатию для каждого вызова. Это очень медленный в сетях с высокой задержкой. Есть ли способ выполнить рукопожатие один раз и повторно использовать существующее соединение для дальнейших сообщений?Выполнять рукопожатие только один раз

Я не могу изменить код сервера для использования сокетов или других протоколов.

ответ

0

Вы открываете новое соединение для каждого запроса. Для повторного использования соединения, вам необходимо либо использовать http.client:

>>> import http.client 
>>> conn = http.client.HTTPSConnection("www.python.org") 
>>> conn.request("GET", "/") 
>>> r1 = conn.getresponse() 
>>> print(r1.status, r1.reason) 
200 OK 
>>> data1 = r1.read() # This will return entire content. 
>>> # The following example demonstrates reading data in chunks. 
>>> conn.request("GET", "/") 
>>> r1 = conn.getresponse() 
>>> while not r1.closed: 
...  print(r1.read(200)) # 200 bytes 
b'<!doctype html>\n<!--[if"... 
... 
>>> # Example of an invalid request 
>>> conn.request("GET", "/parrot.spam") 
>>> r2 = conn.getresponse() 
>>> print(r2.status, r2.reason) 
404 Not Found 
>>> data2 = r2.read() 
>>> conn.close() 

Или использовать рекомендованный питон Requests Package, который имеет session objects, которые делают использование постоянных соединений (с использованием urllib3).

-1

Вы должны открыть для него поток, потому что HTTP/(s) не имеет своего открытого нового сокета для сервера для каждого соединения.

Таким образом, с этой логикой нет способа, но я просто искал вокруг, чтобы открыть постоянное соединение. Я просто вижу, что это поможет. Он упоминает о urllib2

Persistent HTTPS Connections in Python

Смежные вопросы