python - 程序退出后,套接字描述符文件保留在磁盘上
问题描述
我正在使用 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()
- 视窗 10
- Python 3.8.10
- pyzmq 22.3.0
- libzmq 4.3.4
解决方案
推荐阅读
- python - 如何将 seaborn/matplotlib 轴刻度标签从数字格式化为数千或数百万?(125,436 至 125.4K)
- facebook-javascript-sdk - 在 NativeScript 中无法连接到 Facebook
- matlab - 在matlab中比较来自3D数组的向量的最快方法是什么?
- asp.net-core - 未找到本地化资源。部分视图和控制器
- python - 第一次赋值后继续循环
- azure - Azure 上的 SFTP/FTP 服务
- java - 如何在intellij插件类中获取提交文本
- kafka-consumer-api - 无法在 python 3.7 版中设置 KafkaUtills.createdirectstream 偏移量
- c++ - C++,用n个元素替换第i个元素(低复杂度)
- php - if else 循环使用 div 为 post count 0 和 >0