From b97fff75065804c8cafe07d88e7aa9032fbf1c92 Mon Sep 17 00:00:00 2001 From: Martin Durant Date: Fri, 14 Feb 2025 09:07:22 -0500 Subject: [PATCH 1/2] Automatically clean thread and loop on fork --- fsspec/asyn.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fsspec/asyn.py b/fsspec/asyn.py index adeb88fb4..42b04f6e6 100644 --- a/fsspec/asyn.py +++ b/fsspec/asyn.py @@ -151,6 +151,16 @@ def get_loop(): return loop[0] +def reset_after_fork(): + global lock + loop[0] = None + iothread[0] = None + lock = None + + +os.register_at_fork(after_in_child=reset_after_fork) + + if TYPE_CHECKING: import resource From 785af5f5c1d7c5a298c9439c471be430391c563c Mon Sep 17 00:00:00 2001 From: Martin Durant Date: Wed, 12 Mar 2025 12:38:42 -0400 Subject: [PATCH 2/2] for win --- fsspec/asyn.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fsspec/asyn.py b/fsspec/asyn.py index 42b04f6e6..a66487e03 100644 --- a/fsspec/asyn.py +++ b/fsspec/asyn.py @@ -158,7 +158,9 @@ def reset_after_fork(): lock = None -os.register_at_fork(after_in_child=reset_after_fork) +if hasattr(os, "register_at_fork"): + # should be posix; this will do nothing for spawn or forkserver subprocesses + os.register_at_fork(after_in_child=reset_after_fork) if TYPE_CHECKING: