You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jupyter Notebook中_UnixSelectorEventLoop删除时缺失_closed属性求助

解决Jupyter Notebook中_UnixSelectorEventLoop对象__del__触发的AttributeError问题

问题概述

在实验室部分Mac设备的Jupyter Notebook环境下运行Python自动化单元测试时,会出现一条被忽略的警告:AttributeError: '_UnixSelectorEventLoop' object has no attribute '_closed'。该错误源于_UnixSelectorEventLoop对象销毁时,其__del__方法调用is_closed()检查self._closed属性,但此时对象缺失该属性;由于错误发生在对象删除上下文,被转为警告输出。

该问题仅在特定Mac设备的Jupyter环境中触发,Windows设备和部分个人Mac无此现象,使用Python 3.10版本,普通Python运行环境不会复现。

排查过程中发现:

  • __del__方法执行到return行时触发问题,但GC调试排除了循环引用导致的回收异常
  • 调用dir(self)显示对象无任何预期的实例变量,如同未初始化的空壳
  • __init__与__del__调用次数一致,但两者的self ID不匹配,推测存在未完整初始化的对象复制行为,且__init__调用来自tornado框架

解决思路与方案

1. 给__del__/is_closed()增加防御性检查

直接修改涉及的方法,避免因属性缺失触发错误:

  • 修改__del__方法:
    def __del__(self):
        try:
            if self.is_closed():
                # 保留原有逻辑
                pass
        except AttributeError:
            # 跳过未初始化对象的处理
            return
    
  • 或给is_closed()增加属性存在性判断:
    def is_closed(self):
        return getattr(self, '_closed', True)
    

2. 调整Jupyter事件循环配置

Jupyter依赖tornado作为后端,部分设备可能存在事件循环初始化异常,尝试强制指定或重置事件循环:

import asyncio
# 强制使用默认事件循环策略
asyncio.set_event_loop_policy(asyncio.DefaultEventLoopPolicy())

# 或在Notebook中重置事件循环
await asyncio.get_event_loop().shutdown_asyncgens()

3. 统一tornado版本

实验室设备与个人设备的tornado版本差异可能是诱因,尝试升级到稳定版:

pip install --upgrade tornado

4. 避免手动操作事件循环

检查测试代码中是否存在手动创建_UnixSelectorEventLoop的逻辑,或线程切换时错误传递事件循环对象的情况。尽量依赖Jupyter提供的默认事件循环,减少手动实例化操作。

5. 临时屏蔽警告(应急方案)

若暂时无法定位根源,可通过警告过滤器屏蔽该提示:

import warnings
warnings.filterwarnings("ignore", category=ResourceWarning, message=".*_UnixSelectorEventLoop.*")

内容的提问来源于stack exchange,提问作者Peter Mawhorter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:08:04