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