Python-Запросы закрыть http-соединение
Мне было интересно, как вы закрываете соединение с запросами (python-requests.org)?
С httplib
it HTTPConnection.close()
, но как я могу сделать то же самое с запросами?
Код ниже:
r = requests.post("https://stream.twitter.com/1/statuses/filter.json", data={'track':toTrack}, auth=('username', 'passwd'))
for line in r.iter_lines():
if line:
self.mongo['db'].tweets.insert(json.loads(line))
Спасибо заранее.
Ответы
Ответ 1
Как обсуждалось здесь, на самом деле это не так, как HTTP-соединение, и то, что httplib означает, что HTTPConnection действительно является базовым TCP-соединением, я действительно много знаю о ваших просьбах. Запросы абстрагируют это, и вы никогда не увидите его.
Самая новая версия запросов действительно поддерживает соединение TCP после вашего запроса. Если вы хотите, чтобы ваши TCP-соединения закрылись, вы можете просто настроить запросы, чтобы не использовать keep-alive.
s = requests.session()
s.config['keep_alive'] = False
Ответ 2
Я думаю, что более надежным способом закрытия соединения является указание ядру явно закрыть его способом соответствующим спецификации HTTP:
HTTP/1.1 определяет параметр "закрыть" для отправителя сигнал о том, что соединение будет закрыто после завершения ответ. Например,
Connection: close
в полях запроса или заголовка ответа указывает, что соединение НЕ ДОЛЖНО считаться "стойким" (раздел 8.1) после текущий запрос/ответ завершен.
Заголовок заголовка Connection: close
добавляется к фактическому запросу:
r = requests.post(url=url, data=body, headers={'Connection':'close'})
Ответ 3
В запросах 1.X соединение доступно для объекта ответа:
r = requests.post("https://stream.twitter.com/1/statuses/filter.json",
data={'track': toTrack}, auth=('username', 'passwd'))
r.connection.close()
Ответ 4
используйте response.close()
, чтобы закрыть, чтобы избежать ошибки "слишком много открытых файлов"
например:
r = requests.post("https://stream.twitter.com/1/statuses/filter.json", data={'track':toTrack}, auth=('username', 'passwd'))
....
r.close()
Ответ 5
Я пришел к этому вопросу, пытаясь решить проблему "too many open files" error
, но я использую requests.session()
в своем коде. Несколько поисков позже, и я придумал ответ на Документацию по запросам на Python, в которой предлагается использовать блок with
, чтобы сеанс был закрыт, даже если есть необработанные исключения:
with requests.Session() as s:
s.get('http://google.com')
Если вы не используете Session, вы можете сделать то же самое: http://docs.python-requests.org/en/master/api/#requests.Response.close
with requests.get('http://httpbin.org/get', stream=True) as r:
# Do something