资源警告:未关闭的套接字<zmq.Socket(zmq.PUSH) when Threading

问题描述 投票:0回答:1

所以我在导入驱动程序时遇到问题,这显然导致我打开的几乎所有线程都以资源警告结束。 (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 驱动程序后,线程可以正常工作,直到它们关闭为止。

如果有人知道如何解决潜在问题,我会很高兴。

multithreading zeromq tracemalloc
1个回答
0
投票

你是在

Context
之外创造你的
def start_camera(..)
吗?

如果是这样,那么你应该把它移到里面。

def start_camera(..)
之外的代码将在主线程上运行, 但是当你打电话给
start
时,它会在自己的线程上。

出于这个原因,您需要一个新的

Context
,根据文档

在分叉后在子进程中调用时,将创建一个新的全局实例,而不是从父进程继承一个不起作用的上下文。

© www.soinside.com 2019 - 2024. All rights reserved.