Выполните рукопожатие только один раз
Я использую urllib.request.urlopen
получать данные с сервера через HTTPS
, Функция часто вызывается на один и тот же сервер, часто на один и тот же URL. Однако, в отличие от стандартных веб-браузеров, которые выполняют рукопожатие по первоначальному запросу, вызов отдельных urlopen(url)
Это приведет к новому рукопожатию для каждого звонка. Это очень медленно в сетях с высокой задержкой. Есть ли способ выполнить рукопожатие один раз и повторно использовать существующее соединение для дальнейшей связи?
Я не могу изменить код сервера для использования сокетов или других протоколов.
2 ответа
Вы открываете новое соединение для каждого запроса. Чтобы повторно использовать соединение, вы должны использовать 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()
Или используйте рекомендованный пакет запросов Python, в котором есть объекты сеанса, использующие постоянные соединения (используя urllib3).
Вы должны открыть для него поток, потому что HTTP/ s не имеет состояния, это открывает новый сокет серверу для каждого соединения.
Так что с этой логикой нет никакой возможности, но я просто искал постоянное соединение. Я просто вижу эту надежду, это поможет. Упоминается о urllib2