【问题标题】:Python3: ResourceWarning UnclosedPython3:资源警告未关闭
【发布时间】:2015-12-29 20:06:00
【问题描述】:

我有一个用 Python 编码的 Reddit Bot,有时我会收到以下错误:

sys:1: ResourceWarning: unclosed ssl.SSLSocket fd=4, family=AddressFamily.AF_INET, type=2049, proto=6, laddr=('192.168.1.113', 55513), raddr=('198.41.209.140 ', 443)>

192.168.1.113 是我的本地 IP,198.41.209.140 显然是 CloudFlare 的 IP

我有时也会收到以下错误,这让我认为问题与 SSL 有关?

错误 EOF 发生违反协议 (_ssl.c:598)

我该如何解决这个问题?

编辑:如何查看导致此问题的代码部分?我的 try/except 中有一个异常将所有异常打印为:

except Exception as e:
    print("Login/API Error", e)

但是我得到的所有错误都没有这个,这意味着它不是一个例外?

【问题讨论】:

  • ResourceWarning 表示程序在未关闭套接字的情况下退出。异常是一个可能的原因,因为它可能导致显式关闭。一种解决方案是使用with 语句和上下文管理器。
  • 我将如何缩小问题所在?

标签: python python-3.x ssl cloudflare


【解决方案1】:

我没有在自己的代码中使用过套接字,所以以下是基于我的 Python 常识。

套接字文档没有说socket.socket 实例是上下文管理器,但该类具有必需的__enter____exit__ 方法。两者都是标准的、最小的实现。您可能希望将 socket 或 SSLSocket 子类化以在__exit__ 中执行更多操作,例如打印您的替代品以代替回溯。但要开始,您需要查看完整的回溯。子类SSLSocket 继承了这两种方法。由于 SSLSocket “包装”了一个套接字,显然有两个对象需要关注。因此,对于代码的顶层结构,我将从以下(显然未经测试)开始:

<preliminary code>
with socket.socket(...) as sock  # or other socket-returning function
  <more preparation>
  with ssl.wrap_socket(sock, ...) as SSLsock # or the context function
    <use SSLsock to communicate>

您收到的错误消息应该以SSLEOFError 为前缀。是吗?文档说“SSL 连接突然终止时引发的 SSLError 的子类。通常,遇到此错误时,您不应尝试重用底层传输。”这绝对是一个例外。

>>> issubclass(ssl.SSLEOFError, Exception)
True

什么可能导致 Cloudfare “突然”终止连接?其协议处理中的错误; ssl.py 中的错误?您的机器人是否以某种方式违反了服务条款?

如果您无法在此处获得所需的所有答案,我会尝试python-list,也可以通过news.gmane.org 的新闻组gmane.comp.python.general 访问。它的参与者有网络经验。

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 2017-07-29
    • 2021-11-11
    • 1970-01-01
    • 2013-01-31
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多