Python-запросы закрыть http-соединение
мне было интересно, как вы закрываете соединение с запросами (python-requests.org)?
С httplib
это 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))
спасибо заранее.
6 ответов
Как обсуждалось здесь, на самом деле нет такой вещи, как HTTP-соединение, и то, что httplib ссылается на HTTPConnection, действительно является базовым TCP-соединением, которое на самом деле не знает много о ваших запросах вообще. Запросы абстрагируются, и вы никогда не увидите его.
новейшая версия запросов фактически поддерживает TCP-соединение после вашего запроса.. Если вы хотите, чтобы ваш TCP-соединения, вы можете просто настроить запросы не использовать keep-alive.
s = requests.session()
s.config['keep_alive'] = False
Я думаю, что более надежный способ закрытия соединения - сказать sever явно, чтобы закрыть его таким образом соответствует спецификации HTTP:
HTTP / 1.1 определяет параметр" закрыть " соединение для отправителя сигнал о том, что соединение будет закрыто после завершения ответ. Например,
Connection: close
в полях запроса или заголовка ответа указывается, что соединение не следует рассматривать `настойчивый' (раздел 8.1) после текущий запрос / ответ завершен.
на Connection: close
заголовок добавляется к фактическому запрос:
r = requests.post(url=url, data=body, headers={'Connection':'close'})
По Запросам 1.X, соединение доступно на объекте ответа:
r = requests.post("https://stream.twitter.com/1/statuses/filter.json",
data={'track': toTrack}, auth=('username', 'passwd'))
r.connection.close()
Я пришел к этому вопросу, чтобы решить "too many open files" error
, но я использую requests.session()
в моем коде. Несколько поисков позже и я придумал ответ на Python Запрашивает Документацию, который предлагает использовать with
блок, чтобы сеанс был закрыт, даже если есть необработанные исключения:
with requests.Session() as s:
s.get('http://google.com')
если вы не используете сессии, вы можете сделать то же самое: http://docs.python-requests.org/en/master/api/#requests.Response.close
with requests.get('http://httpbin.org/get', stream=True) as r:
# Do something
пожалуйста, используйте response.close()
закрыть, чтобы избежать "слишком много открытых файлов" ошибка
например:
r = requests.post("https://stream.twitter.com/1/statuses/filter.json", data={'track':toTrack}, auth=('username', 'passwd'))
....
r.close()