导入nidaqmx后线程出现未关闭Socket警告及内核崩溃问题求助
nidaqmx导入引发线程ResourceWarning及内核崩溃问题
环境信息
- Windows系统
- Anaconda环境,Python版本3.9.16
- nidaqmx版本0.6.5
问题现象
导入nidaqmx后,几乎所有开启的线程都会触发ResourceWarning警告;多次启停包含该导入的线程实例(如摄像头线程)约4次后,内核会崩溃重启。
- 不导入
nidaqmx时,所有线程运行正常; - 导入
nidaqmx后,线程运行阶段正常,但关闭时触发资源警告及后续崩溃问题。
最小复现代码
import threading import nidaqmx # 引发问题的导入语句 def idling(): for i in range(10): print("still idling")
启动线程的代码:
idling_thread = threading.Thread(target = idling) idling_thread.start()
警告信息
sys:1: ResourceWarning: unclosed socket <zmq.Socket(zmq.PUSH) at 0x132d0955880>
tracemalloc调用栈
File "C:\Users\lib\site-packages\ipykernel\iostream.py", lineno 563 self._schedule_flush() File "C:\Users\lib\site-packages\ipykernel\iostream.py", lineno 469 self.pub_thread.schedule(_schedule_in_thread) File "C:\Users\lib\site-packages\ipykernel\iostream.py", lineno 210 self._event_pipe.send(b"") File "C:\Users\lib\site-packages\ipykernel\iostream.py", lineno 98 event_pipe = ctx.socket(zmq.PUSH) File "C:\Users\lib\site-packages\zmq\sugar\context.py", lineno 259 s: ST = self._socket_class( # set PYTHONTRACEMALLOC=2 to get the calling frame
排查与解决思路
- 延迟nidaqmx导入时机:不在全局作用域导入
nidaqmx,而是在实际需要使用该库的函数内部导入,避免其修改全局线程上下文,干扰ipykernel的IO资源管理。 - 显式回收ZMQ资源:针对调用栈中未关闭的ZMQ Socket,尝试在线程结束后显式清理相关资源,比如使用
contextlib.closing包裹Socket创建逻辑,或手动调用socket.close()方法。 - 升级依赖版本:尝试将
nidaqmx升级至最新稳定版,检查官方是否修复了类似线程资源泄漏问题;同时升级ipykernel、pyzmq等相关依赖,排除版本兼容冲突。 - 脱离交互式环境测试:在普通Python脚本(而非Jupyter Notebook/Console)中运行代码,验证问题是否由ipykernel的特殊IO线程机制与nidaqmx的冲突导致。
- 更新底层驱动:确保Windows系统上安装的NI-DAQmx官方驱动为最新版本,Python的
nidaqmx库依赖底层驱动,底层驱动的BUG也可能引发上层资源管理问题。
内容的提问来源于stack exchange,提问作者Toni Berger
相关产品推荐
相关产品推荐

