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

