From 896a9a76e682e65795f4cac9bf126c1773d10163 Mon Sep 17 00:00:00 2001 From: Andrew Lahiff Date: Thu, 2 Mar 2023 18:33:25 +0000 Subject: [PATCH 1/4] Use multiprocessing.Event to tell worker when to exit --- simvue/run.py | 6 +++++- simvue/worker.py | 8 +++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/simvue/run.py b/simvue/run.py index 2d0dd4ca..66f74879 100644 --- a/simvue/run.py +++ b/simvue/run.py @@ -162,6 +162,7 @@ def __enter__(self): def __exit__(self, type, value, traceback): if self._name and self._status == 'running': + self._shutdown_event.set() if not type: self.set_status('completed') else: @@ -203,8 +204,10 @@ def _start(self, reconnect=False): self._metrics_queue = multiprocessing.Manager().Queue(maxsize=self._queue_size) self._events_queue = multiprocessing.Manager().Queue(maxsize=self._queue_size) + self._shutdown_event = multiprocessing.Manager().Event() self._worker = Worker(self._metrics_queue, self._events_queue, + self._shutdown_event, self._uuid, self._name, self._url, @@ -659,8 +662,9 @@ def close(self): if not self._active: self._error('Run is not active') return False - + self.set_status('completed') + self._shutdown_event.set() def set_folder_details(self, path, metadata={}, tags=[], description=None): """ diff --git a/simvue/worker.py b/simvue/worker.py index a2c98d31..f79a5838 100644 --- a/simvue/worker.py +++ b/simvue/worker.py @@ -29,11 +29,12 @@ def update_processes(parent, processes): class Worker(threading.Thread): - def __init__(self, metrics_queue, events_queue, uuid, run_name, url, headers, mode, pid, resources_metrics_interval): + def __init__(self, metrics_queue, events_queue, shutdown_event, uuid, run_name, url, headers, mode, pid, resources_metrics_interval): threading.Thread.__init__(self) self._parent_thread = threading.currentThread() self._metrics_queue = metrics_queue self._events_queue = events_queue + self._shutdown_event = shutdown_event self._run_name = run_name self._uuid = uuid self._url = url @@ -144,11 +145,12 @@ def run(self): pass buffer = [] - if not self._parent_thread.is_alive(): + if self._shutdown_event.is_set(): if self._metrics_queue.empty() and self._events_queue.empty(): + print('eixitig') sys.exit(0) else: counter = 0 - while counter < POLLING_INTERVAL and self._parent_thread.is_alive(): + while counter < POLLING_INTERVAL and not self._shutdown_event.is_set(): time.sleep(1) counter += 1 From 0bb90d810a405240b2ce8f7a16622ad753b90121 Mon Sep 17 00:00:00 2001 From: Andrew Lahiff Date: Thu, 2 Mar 2023 18:36:08 +0000 Subject: [PATCH 2/4] Remove debug message --- simvue/worker.py | 1 - 1 file changed, 1 deletion(-) diff --git a/simvue/worker.py b/simvue/worker.py index f79a5838..e03ce5c7 100644 --- a/simvue/worker.py +++ b/simvue/worker.py @@ -147,7 +147,6 @@ def run(self): if self._shutdown_event.is_set(): if self._metrics_queue.empty() and self._events_queue.empty(): - print('eixitig') sys.exit(0) else: counter = 0 From 3f8783c98f0199e9ceeafefd8084fd5855b34133 Mon Sep 17 00:00:00 2001 From: Andrew Lahiff Date: Fri, 3 Mar 2023 07:35:29 +0000 Subject: [PATCH 3/4] Add back in the check that the parent is still alive, just in case --- simvue/worker.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/simvue/worker.py b/simvue/worker.py index e03ce5c7..ca94a84c 100644 --- a/simvue/worker.py +++ b/simvue/worker.py @@ -145,11 +145,11 @@ def run(self): pass buffer = [] - if self._shutdown_event.is_set(): + if self._shutdown_event.is_set() or not self._parent_thread.is_alive(): if self._metrics_queue.empty() and self._events_queue.empty(): sys.exit(0) else: counter = 0 - while counter < POLLING_INTERVAL and not self._shutdown_event.is_set(): + while counter < POLLING_INTERVAL and not self._shutdown_event.is_set() and self._parent_thread.is_alive(): time.sleep(1) counter += 1 From 7fecc2373343ba502d50d2afbf07c7deb110a36f Mon Sep 17 00:00:00 2001 From: Andrew Lahiff Date: Fri, 3 Mar 2023 07:35:39 +0000 Subject: [PATCH 4/4] Update version --- CHANGELOG.md | 5 +++++ simvue/__init__.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71ba374f..efdeb7b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Change log +## v0.10.1 + +* The worker process now no longer gives a long delay when a run has finished (now at most ~1 second). +* The worker process ends when the `Run()` context ends or `close` is called, rather than only when the main process exits. + ## v0.10.0 * The `client` class can now be used to retrieve runs. diff --git a/simvue/__init__.py b/simvue/__init__.py index c90b30d6..8a432658 100644 --- a/simvue/__init__.py +++ b/simvue/__init__.py @@ -2,4 +2,4 @@ from simvue.client import Client from simvue.handler import Handler from simvue.models import RunInput -__version__ = '0.10.0' +__version__ = '0.10.1'