From f3c8940ebef96af3f673b2a4d7b39ebe5cbc11a9 Mon Sep 17 00:00:00 2001 From: Philipp Rudiger Date: Sun, 29 Aug 2021 17:04:20 +0200 Subject: [PATCH] Ensure threaded servers are killed after test failures --- panel/io/server.py | 2 ++ panel/io/state.py | 7 +++++++ panel/tests/conftest.py | 9 +++++++++ 3 files changed, 18 insertions(+) diff --git a/panel/io/server.py b/panel/io/server.py index cca3a53547..1d4b5f7bbc 100644 --- a/panel/io/server.py +++ b/panel/io/server.py @@ -538,6 +538,8 @@ def serve(panels, port=0, address=None, websocket_origin=None, loop=None, server = StoppableThread( target=get_server, io_loop=loop, args=(panels,), kwargs=kwargs ) + server_id = kwargs.get('server_id', uuid.uuid4().hex) + state._threads[server_id] = server server.start() else: server = get_server(panels, **kwargs) diff --git a/panel/io/state.py b/panel/io/state.py index 4c724457fd..2135674ade 100644 --- a/panel/io/state.py +++ b/panel/io/state.py @@ -84,6 +84,7 @@ class _state(param.Parameterized): # An index of all currently active servers _servers = {} + _threads = {} # Jupyter display handles _handles = {} @@ -260,6 +261,12 @@ def kill_all_servers(self): """ Stop all servers and clear them from the current state. """ + for thread in self._threads.values(): + try: + thread.stop() + except Exception: + pass + self._threads = {} for server_id in self._servers: try: self._servers[server_id][0].stop() diff --git a/panel/tests/conftest.py b/panel/tests/conftest.py index c7522897ac..6fb57c9dba 100644 --- a/panel/tests/conftest.py +++ b/panel/tests/conftest.py @@ -163,3 +163,12 @@ def set_env_var(env_var, value): del os.environ[env_var] else: os.environ[env_var] = old_value + + +@pytest.fixture(autouse=True) +def server_cleanup(): + """ + Clean up after test fails + """ + yield + state.kill_all_servers()