首页 > 解决方案 > 程序退出后,套接字描述符文件保留在磁盘上

问题描述

我正在使用 zeromq 在 Python 中的进程之间发送 numpy 数组。程序退出后,一个名为的文件zmq_endpoint仍保留在磁盘上。我试图显式关闭套接字和上下文,但这没有帮助。

我应该怎么做才能在退出时正确清理?

推侧:

        endpoint = "zmq_endpoint"

        # Start process for PULL socket
        self._io_proc = Process(target=_video_processing_func, args=(endpoint,))
        self._io_proc.start()

        # Create PUSH socket
        self._zmq_context = zmq.Context()
        self._socket = self._zmq_context.socket(zmq.PUSH)
        self._socket.connect(f"ipc://{endpoint}")

        ...

        # Send a message over the socket
        self._socket.send(b'data', flags=zmq.NOBLOCK | zmq.SNDMORE)
        self._socket.send(str(len(msg.frames)).encode('ascii'), flags=zmq.NOBLOCK | zmq.SNDMORE)

        for frame in frames:
            send_array(self._socket, frame, flags=zmq.NOBLOCK | zmq.SNDMORE)

        self._socket.send(b'end', flags=zmq.NOBLOCK)

        ...

        # Cleanup
        self._socket.send(b'stop', flags=zmq.NOBLOCK)
        self._io_proc.join(5)

        self._socket.close(linger=1)
        self._zmq_context.term()

拉面:

def _video_recording_func(endpoint):
    context = zmq.Context()
    socket = context.socket(zmq.PULL)
    socket.bind(f"ipc://{endpoint}")

    try:
        while True:
            msg = socket.recv()
            if msg == b'data':
                # Receive data from queue
                n_frames = int(socket.recv())

                for i in range(n_frames):
                    frm = recv_array(socket)
                    # Process frame...

                assert socket.recv() == b'end'

            elif msg == b'stop':
                break
            else:
                assert False, "Corrupt message received in queue"
    finally:
        for writer in video_writers:
            if writer is not None:
                writer.release()
        socket.close(linger=1)
        context.term()

标签: pythonzeromq

解决方案


推荐阅读