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

导入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:16:28