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
相关产品推荐
相关产品推荐

