← back to Exo
fix: suppress closure errors in runnersupervisor and force spawn start method (#1547)
c90a0cec787e8e3ebfe76a77e168f8ae377d4f59 · 2026-02-23 10:30:41 -0800 · Alex Cheema
some errors could be thrown during shutdown - we can dismiss these safely
co-authored by me :)
Files touched
M src/exo/main.pyM src/exo/worker/runner/runner_supervisor.py
Diff
commit c90a0cec787e8e3ebfe76a77e168f8ae377d4f59
Author: Alex Cheema <41707476+AlexCheema@users.noreply.github.com>
Date: Mon Feb 23 10:30:41 2026 -0800
fix: suppress closure errors in runnersupervisor and force spawn start method (#1547)
some errors could be thrown during shutdown - we can dismiss these safely
co-authored by me :)
---
src/exo/main.py | 2 +-
src/exo/worker/runner/runner_supervisor.py | 11 ++++++++---
2 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/src/exo/main.py b/src/exo/main.py
index 8a56ab19..85e27b29 100644
--- a/src/exo/main.py
+++ b/src/exo/main.py
@@ -252,7 +252,7 @@ def main():
target = min(max(soft, 65535), hard)
resource.setrlimit(resource.RLIMIT_NOFILE, (target, hard))
- mp.set_start_method("spawn")
+ mp.set_start_method("spawn", force=True)
# TODO: Refactor the current verbosity system
logger_setup(EXO_LOG, args.verbosity)
logger.info("Starting EXO")
diff --git a/src/exo/worker/runner/runner_supervisor.py b/src/exo/worker/runner/runner_supervisor.py
index 4aa4e6f7..565ca315 100644
--- a/src/exo/worker/runner/runner_supervisor.py
+++ b/src/exo/worker/runner/runner_supervisor.py
@@ -106,13 +106,18 @@ class RunnerSupervisor:
def shutdown(self):
logger.info("Runner supervisor shutting down")
self._tg.cancel_tasks()
- self._ev_recv.close()
- self._task_sender.close()
if not self._cancel_watch_runner.cancel_called:
self._cancel_watch_runner.cancel()
+ with contextlib.suppress(ClosedResourceError):
+ self._ev_recv.close()
+ with contextlib.suppress(ClosedResourceError):
+ self._task_sender.close()
+ with contextlib.suppress(ClosedResourceError):
+ self._event_sender.close()
with contextlib.suppress(ClosedResourceError):
self._cancel_sender.send(TaskId("CANCEL_CURRENT_TASK"))
- self._cancel_sender.close()
+ with contextlib.suppress(ClosedResourceError):
+ self._cancel_sender.close()
self.runner_process.join(5)
if not self.runner_process.is_alive():
logger.info("Runner process succesfully terminated")
← e8c13371 fix: add download/resume buttons to pending downloads (#1581
·
back to Exo
·
test: verify instance deletion cancels ongoing tasks (#1508) d3d12958 →