[object Object]

← 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

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 →