Skip to content

Commit 93d882b

Browse files
committed
fix: Unregister semaphores from stdlib tracker immediately after creation
The previous fix attempted to unregister after loky's registration, but this was too late. The semaphore is registered with stdlib tracker when _SemLock() is created, so we must unregister immediately after creation in both code paths: - In the loop when name=None (after line 79-81) - When name is provided (after line 97) This prevents 'leaked semaphore' warnings on Python 3.13+ while loky handles cleanup properly through its own resource tracker.
1 parent c144380 commit 93d882b

File tree

1 file changed

+16
-9
lines changed

1 file changed

+16
-9
lines changed

loky/backend/synchronize.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,14 @@ def __init__(self, kind, value, maxvalue, name=None):
7979
self._semlock = _SemLock(
8080
kind, value, maxvalue, SemLock._make_name(), unlink_now
8181
)
82+
# FIX: Unregister from stdlib resource_tracker immediately after creation
83+
# to prevent "leaked semaphore" warnings on Python 3.13+
84+
if stdlib_resource_tracker is not None:
85+
try:
86+
stdlib_resource_tracker.unregister(self._semlock.name, "semlock")
87+
except (KeyError, ValueError):
88+
# Semaphore wasn't registered in stdlib tracker, that's fine
89+
pass
8290
except FileExistsError: # pragma: no cover
8391
pass
8492
else:
@@ -87,6 +95,14 @@ def __init__(self, kind, value, maxvalue, name=None):
8795
raise FileExistsError("cannot find name for semaphore")
8896
else:
8997
self._semlock = _SemLock(kind, value, maxvalue, name, unlink_now)
98+
# FIX: Unregister from stdlib resource_tracker immediately after creation
99+
# to prevent "leaked semaphore" warnings on Python 3.13+
100+
if stdlib_resource_tracker is not None:
101+
try:
102+
stdlib_resource_tracker.unregister(self._semlock.name, "semlock")
103+
except (KeyError, ValueError):
104+
# Semaphore wasn't registered in stdlib tracker, that's fine
105+
pass
90106
self.name = name
91107
util.debug(
92108
f"created semlock with handle {self._semlock.handle} and name "
@@ -104,15 +120,6 @@ def _after_fork(obj):
104120
# process shuts down we unlink the semaphore name
105121
resource_tracker.register(self._semlock.name, "semlock")
106122

107-
# FIX: Unregister from Python's stdlib resource_tracker to prevent
108-
# "leaked semaphore" warnings on Python 3.13+, since loky handles cleanup
109-
if stdlib_resource_tracker is not None:
110-
try:
111-
stdlib_resource_tracker.unregister(self._semlock.name, "semlock")
112-
except (KeyError, ValueError):
113-
# Semaphore wasn't registered in stdlib tracker, that's fine
114-
pass
115-
116123
util.Finalize(
117124
self, SemLock._cleanup, (self._semlock.name,), exitpriority=0
118125
)

0 commit comments

Comments
 (0)