所以我在导入驱动程序时遇到问题,这显然导致我打开的几乎所有线程都以资源警告结束。 (Anaconda 环境下 Windows 上的 python 版本 3.9.16;nidaqmx 版本 0.6.5)
通过导入打开和关闭多个线程实例后,内核似乎死了。
这是最小的可复制示例:
import threading
import nidaqmx #This is the import that causes the problems
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
所以在我看来,根本原因似乎是,驱动程序的导入以某种方式扰乱了与我的线程的通信。 我可以忽略这个警告,但如前所述,我注意到,连续打开和关闭相机线程(通常大约 4 次)会导致内核死机并重新启动。
请注意,如果没有导入驱动程序 nidaqmx,所有线程都可以正常工作。导入 nidaqmx 驱动程序后,线程可以正常工作,直到它们关闭为止。
如果有人知道如何解决潜在问题,我会很高兴。
你是在
Context
之外创造你的def start_camera(..)
吗?
如果是这样,那么你应该把它移到里面。
def start_camera(..)
之外的代码将在主线程上运行,
但是当你打电话给start
时,它会在自己的线程上。
出于这个原因,您需要一个新的
Context
,根据文档:
在分叉后在子进程中调用时,将创建一个新的全局实例,而不是从父进程继承一个不起作用的上下文。