From 86c83fffc053101ae6a6b16361f03c0af1dea30b Mon Sep 17 00:00:00 2001 From: Matthias Mayer Date: Fri, 30 Jun 2023 15:47:39 +0200 Subject: [PATCH 1/2] Implement close functionality for meshcat viewer and zmqserver that hosts the three.js webpage --- src/meshcat/servers/zmqserver.py | 12 ++++++++++++ src/meshcat/visualizer.py | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/src/meshcat/servers/zmqserver.py b/src/meshcat/servers/zmqserver.py index 3b7e39a..fd28135 100644 --- a/src/meshcat/servers/zmqserver.py +++ b/src/meshcat/servers/zmqserver.py @@ -4,6 +4,7 @@ import base64 import os import re +import signal import sys import subprocess import multiprocessing @@ -406,10 +407,21 @@ def main(): if results.open: webbrowser.open(bridge.web_url, new=2) + def cleanup(): + bridge.zmq_socket.close() + bridge.context.destroy() + + # Make sure also kill results in socket being closed otherwise ZMQbg/Reaper and IO processes might stay open + atexit.register(cleanup) + signal.signal(signal.SIGTERM, cleanup) + signal.signal(signal.SIGINT, cleanup) + try: bridge.run() except KeyboardInterrupt: pass + finally: + cleanup() if __name__ == '__main__': main() diff --git a/src/meshcat/visualizer.py b/src/meshcat/visualizer.py index b7b9264..7afe260 100644 --- a/src/meshcat/visualizer.py +++ b/src/meshcat/visualizer.py @@ -1,3 +1,4 @@ +import signal import webbrowser import umsgpack import numpy as np @@ -79,6 +80,12 @@ def get_image(self, w, h): img = Image.open(io.BytesIO(img_bytes)) return img + def close(self): + self.zmq_socket.close() + self.context.destroy() + if self.server_proc is not None: + self.server_proc.send_signal(signal.SIGINT) + self.server_proc.wait() def srcdoc_escape(x): return x.replace("&", "&").replace('"', """) From e886319a370c328561a091fbbb23b13411cda0a0 Mon Sep 17 00:00:00 2001 From: Matthias Mayer Date: Mon, 3 Jul 2023 11:37:40 +0200 Subject: [PATCH 2/2] use proper kill for server --- src/meshcat/visualizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/meshcat/visualizer.py b/src/meshcat/visualizer.py index 7afe260..7960d31 100644 --- a/src/meshcat/visualizer.py +++ b/src/meshcat/visualizer.py @@ -84,7 +84,7 @@ def close(self): self.zmq_socket.close() self.context.destroy() if self.server_proc is not None: - self.server_proc.send_signal(signal.SIGINT) + self.server_proc.kill() self.server_proc.wait() def srcdoc_escape(x):