【问题标题】:Does a python Session instance explicitly need to be closed?python Session 实例是否需要明确关闭?
【发布时间】:2022-08-16 01:22:36
【问题描述】:

假设我正在使用 requests.Session 实例进行 API 调用(而不是 requests.get(...))。

如果在完成调用后我没有在会话实例上显式调用.close(),连接是无限期保持打开状态(因此浪费了连接),还是会话在一段时间后自动关闭?

import requests

def get_some_content():
    session = requests.Session()
    response_200 = session.get(\"https://httpbin.org/status/200\")
    response_500 = session.get(\"https://httpbin.org/status/500\")
    return response_200.content, response_500.content
  • 如果该答案适合您,请接受答案,或者如果您有更多问题,请在 cmets 中询问更多。

标签: python session python-requests


【解决方案1】:

好问题。在标准 Python 中它将被关闭:

  • python GC 垃圾收集时。
  • 代码变得无法访问后立即。

但在 JIT Python (PyPy) 中,它需要被关闭

  • 手动,否则它会保持打开一段时间。

在重复的过程调用中,系统将用完打开的描述符,如果达到限制将导致操作系统错误。

最佳做法是在使用后关闭。

参考:https://doc.pypy.org/en/latest/cpython_differences.html

PyPy 使用或实现的垃圾收集器不是基于引用计数的,因此当对象不再可访问时不会立即释放它们。最明显的影响是文件(和套接字等)超出范围时不会立即关闭。对于为写入而打开的文件,数据可能会在其输出缓冲区中保留一段时间,从而使磁盘上的文件显示为空或被截断。此外,您可能会达到操作系统对同时打开文件数量的限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 2013-11-25
    • 2018-07-15
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    相关资源
    最近更新 更多