Python-Requests关闭http连接

37 python http urllib2 httplib python-requests

我想知道,你如何关闭与Requests(python-requests.org)的连接?

有了httplibHTTPConnection.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))
Run Code Online (Sandbox Code Playgroud)

提前致谢.

Ole*_*ryb 53

我认为关闭连接的一种更可靠的方法是明确告诉服务器以符合HTTP规范的方式关闭它:

HTTP/1.1定义了"关闭"连接选项,发送方在完成响应后发出连接将被关闭的信号.例如,

   Connection: close
Run Code Online (Sandbox Code Playgroud)

在请求或响应头字段中,表示在当前请求/响应完成后,连接不应被视为"持久"(第8.1节).

Connection: close标头被添加到实际的请求:

r = requests.post(url=url, data=body, headers={'Connection':'close'})
Run Code Online (Sandbox Code Playgroud)


Fel*_*ung 21

正如这里所讨论的那样,确实没有HTTP连接和httplib所指的东西,因为HTTPConnection实际上是底层的TCP连接,它根本不了解你的请求.请求抽象出来,你永远不会看到它.

事实上,最新版本的Requests确实会在您的请求之后保持TCP连接处于活动状态.如果您确实希望关闭TCP连接,则可以将请求配置为不使用keep-alive.

s = requests.session()
s.config['keep_alive'] = False
Run Code Online (Sandbox Code Playgroud)

  • 当前的`request`版本有*不支持*关闭Keep-Alive. (24认同)
  • 它应编码为:s.keep_alive = False (13认同)
  • 或者`s = requests.session(config = {'keep_alive':False})` (12认同)
  • OP正在询问如何关闭流媒体响应.我没有看到会话中的keep-alive设置如何帮助那里.请求和urllib3中有几个最近的票据围绕这个问题:https://github.com/shazow/urllib3/pull/132,https://github.com/kennethreitz/requests/issues/1073,https:// github .COM/kennethreitz /请求/问题/ 1041 (5认同)
  • 从当前版本开始,您可以通过读取Response.content(或调用Response.content的Response.text)来确保流连接返回池.但是如果您在没有阅读它们的情况下囤积Response对象,则不会释放您的连接:[Documentation](http://docs.python-requests.org/en/latest/user/advanced/#keep-alive) (3认同)
  • 类型错误:session() 得到了意外的关键字参数“config” (2认同)

stw*_*ite 13

我来到这个问题寻求解决"too many open files" error,但我requests.session()在我的代码中使用.稍后进行一些搜索,我想出了Python请求文档的答案,该文档建议使用该with块,以便即使存在未处理的异常,会话也会关闭:

with requests.Session() as s:
    s.get('http://google.com')
Run Code Online (Sandbox Code Playgroud)

如果您没有使用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
Run Code Online (Sandbox Code Playgroud)

  • 我应该否决其他评论以帮助提升这个评论吗? (4认同)

Wil*_*hes 11

在请求1.X上,响应对象上的连接可用:

r = requests.post("https://stream.twitter.com/1/statuses/filter.json",
                  data={'track': toTrack}, auth=('username', 'passwd'))

r.connection.close()
Run Code Online (Sandbox Code Playgroud)


小智 9

请使用response.close()关闭以避免“打开文件过多”错误

例如:

r = requests.post("https://stream.twitter.com/1/statuses/filter.json", data={'track':toTrack}, auth=('username', 'passwd'))
....
r.close()
Run Code Online (Sandbox Code Playgroud)