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

pytest命令行报Exception ignored与WinError 6错误,求排查

问题描述

命令行运行pytest时出现如下错误,所有测试均通过但该报错令人困扰:

Exception ignored in: <function Pool.__del__ at 0x000001F5C70214E0>
Traceback (most recent call last):
  File "C:\Program Files\Python311\Lib\multiprocessing\pool.py", line 271, in __del__
    self._change_notifier.put(None)
  File "C:\Program Files\Python311\Lib\multiprocessing\queues.py", line 374, in put
    self._writer.send_bytes(obj)
  File "C:\Program Files\Python311\Lib\multiprocessing\connection.py", line 199, in send_bytes
    self._send_bytes(m[offset:offset + size])
  File "C:\Program Files\Python311\Lib\multiprocessing\connection.py", line 279, in _send_bytes
    ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: [WinError 6] The handle is invalid 

在PyCharm中运行时该错误完全被隐藏,经排查问题定位到新增测试中的这段代码:

thread_pool = ThreadPool(pool_size)
results = run_in_pool(function_list, thread_pool)
错误成因分析
  • 这个错误是ThreadPool对象被垃圾回收时,内部资源已提前释放导致的:ThreadPool的__del__方法会尝试向内部的_change_notifier队列发送None来通知线程退出,但此时队列的底层句柄已经被系统回收(Windows下进程退出时资源释放顺序更敏感),因此调用put()时触发了无效句柄的OSError。
  • 核心问题是代码中未显式关闭线程池:创建ThreadPool后,没有调用thread_pool.close()阻止新任务提交,也没调用thread_pool.join()等待所有线程执行完毕并释放资源。测试结束后,Python垃圾回收器清理ThreadPool对象时,底层的线程通信资源已经被系统提前释放,从而触发异常。
  • PyCharm中看不到错误的原因:PyCharm的控制台默认会过滤掉Exception ignored这类被垃圾回收过程中抛出的异常,而命令行的pytest会输出所有未被捕获的异常信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:42:34